Proposes ADR 0053: A module builds outside the monorepo, from Ekklesia packages published over the npm registry protocol. Docs only.
It defines the external module-development and package-distribution contract that ADR 0049 deferred. Installing a module stays registry-free; the registry is only for building one.
Decisions
Protocol, not provider. Packages are distributed over the standard npm registry protocol; Gitea may host the private phase.
Host-neutral lockfiles and an Ekklesia proxy are not required.
A registry move may need a one-time .npmrc change and a lockfile regeneration; integrity hashes keep verifying content.
contracts only as a transitive implementation dependency.
core, the apps, module-ui-host and module-template are never published.
Curated SDK before the first publication.
No full contracts barrel.
No forced Drizzle at the SDK root.
No legacy Drizzle database contract in the standalone surface; Core still serves the legacy facade for ADR 0050's deprecation window.
Drizzle support lives in the module-database adapter.
Dependency rules.
React and ReactDOM are peers of the public UI packages. ADR 0023's bundling is unchanged; the peer only prevents two React copies in one module bundle.
Drizzle is an optional peer only where the adapter needs it.
Modules put runtime packages in dependencies and tooling and config in devDependencies.
Versioning.
One coordinated 0.x version, equal to the platform version, with no mixed trains.
Ranges in source, exact artifacts in lockfiles; module-pack pinned exactly.
Independent versions are deferred.
Standalone packaging.
No monorepo checkout.
The module declares its own Node.js range (engines.node).
The packager recognizes Ekklesia packages by identity and metadata, not by path.
No monorepo-root commands run at install time.
Supply chain.
Versions are immutable, and frozen-lockfile integrity is part of reproducibility.
Release CI packs the public set, inspects the tarballs (intended contents, LICENSE, no workspace: ranges), installs them into a clean standalone module fixture, and proves build, package and verify before publishing.
Signing is deferred.
Private phase. No committed secrets; credentials come from the environment. Actual read access must be verified before the first publication, so private packages never reach an anonymously readable registry by accident.
Signage. The goal is a normal standalone repository with versioned @ekklesia/* dependencies and its own lockfile; its CI never clones Ekklesia. The migration itself is a separate change.
Relationship to other ADRs
Extends 0049: this is its deferred SDK-publishing step.
Proposes **ADR 0053: A module builds outside the monorepo, from Ekklesia packages published over the npm registry protocol**. Docs only.
It defines the external module-development and package-distribution contract that ADR 0049 deferred. Installing a module stays registry-free; the registry is only for building one.
## Decisions
- **Protocol, not provider.** Packages are distributed over the standard npm registry protocol; Gitea may host the private phase.
- Host-neutral lockfiles and an Ekklesia proxy are **not** required.
- A registry move may need a one-time `.npmrc` change and a lockfile regeneration; integrity hashes keep verifying content.
- **Public set.**
- Author API: `module-sdk`, `module-database`, `module-ui-sdk`, `design-tokens`.
- Tooling: `module-ui-build`, `module-pack`, `typescript-config`.
- `ui` as a pre-1.0 component API.
- `contracts` only as a transitive implementation dependency.
- `core`, the apps, `module-ui-host` and `module-template` are never published.
- **Curated SDK before the first publication.**
- No full contracts barrel.
- No forced Drizzle at the SDK root.
- No legacy Drizzle database contract in the standalone surface; Core still serves the legacy facade for ADR 0050's deprecation window.
- Drizzle support lives in the `module-database` adapter.
- **Dependency rules.**
- React and ReactDOM are peers of the public UI packages. ADR 0023's bundling is unchanged; the peer only prevents two React copies in one module bundle.
- Drizzle is an optional peer only where the adapter needs it.
- Modules put runtime packages in `dependencies` and tooling and config in `devDependencies`.
- **Versioning.**
- One coordinated 0.x version, equal to the platform version, with no mixed trains.
- Ranges in source, exact artifacts in lockfiles; `module-pack` pinned exactly.
- Independent versions are deferred.
- **Standalone packaging.**
- No monorepo checkout.
- The module declares its own Node.js range (`engines.node`).
- The packager recognizes Ekklesia packages by identity and metadata, not by path.
- No monorepo-root commands run at install time.
- **Supply chain.**
- Versions are immutable, and frozen-lockfile integrity is part of reproducibility.
- Release CI packs the public set, inspects the tarballs (intended contents, `LICENSE`, no `workspace:` ranges), installs them into a clean standalone module fixture, and proves build, package and verify before publishing.
- Signing is deferred.
- **Private phase.** No committed secrets; credentials come from the environment. Actual read access must be verified before the first publication, so private packages never reach an anonymously readable registry by accident.
- **Release train.** Build → pack → standalone tarball smoke → publish immutable versions → downstream module CI.
- **Signage.** The goal is a normal standalone repository with versioned `@ekklesia/*` dependencies and its own lockfile; its CI never clones Ekklesia. The migration itself is a separate change.
## Relationship to other ADRs
- **Extends 0049:** this is its deferred SDK-publishing step.
- **Related:** 0002, 0006, 0021, 0023, 0039, 0048, 0050, 0051, 0052.
- **ADR 0047** is still Proposed and assembles modules into the platform workspace. It must be revised against this ADR before it is accepted.
## Changes
- `docs/architecture/decisions/0053-standalone-module-development-packages.md` (new, Proposed)
- the ADR index entry
## Verification
- `pnpm verify` passes.
- A relative-link and anchor check of the changed docs passes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Defines the external module-development and package-distribution contract
that ADR 0049 deferred.
- Protocol, not provider: packages are distributed over the standard npm
registry protocol. Gitea may host the private phase. Host-neutral
lockfiles and an Ekklesia proxy are not required; a registry move may need
one configuration change and a lockfile regeneration, while integrity hashes
keep verifying content.
- Public set:
- Author API: module-sdk, module-database, module-ui-sdk, design-tokens.
- Tooling: module-ui-build, module-pack, typescript-config.
- ui as a pre-1.0 component API.
- contracts only as a transitive implementation dependency.
- Core, apps, module-ui-host, and module-template stay unpublished.
- Curated SDK before first publication: no full contracts barrel, no forced
Drizzle at the SDK root, and no legacy Drizzle database contract in the
standalone surface. Drizzle support lives in module-database's adapter.
- Dependency rules: React/ReactDOM are peers of the public UI packages
(bundling per ADR 0023 is unchanged); Drizzle is an optional peer only
where the adapter needs it; modules put runtime packages in dependencies
and tooling/config in devDependencies.
- Versioning: one coordinated 0.x release version equal to the platform
version, with no mixed trains. Ranges go in source and exact artifacts in
lockfiles; module-pack is pinned exactly; independent versions deferred.
- Standalone packaging: no monorepo checkout. The module declares its own
Node range (engines.node). The packager recognizes Ekklesia packages by
identity and metadata, not path. No monorepo-root commands at install time.
- Supply chain: immutable versions, frozen-lockfile integrity, and a
pre-publication smoke that installs the packed tarballs into a clean
standalone fixture and proves build, package, and verify. Signing deferred.
- Private phase: no committed secrets; credentials come from the
environment; verify actual read access before the first publication.
Status Proposed. ADR 0047 (still proposed) must be revised against this. No
code, registry, credential, or Signage changes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Proposes ADR 0053: A module builds outside the monorepo, from Ekklesia packages published over the npm registry protocol. Docs only.
It defines the external module-development and package-distribution contract that ADR 0049 deferred. Installing a module stays registry-free; the registry is only for building one.
Decisions
.npmrcchange and a lockfile regeneration; integrity hashes keep verifying content.module-sdk,module-database,module-ui-sdk,design-tokens.module-ui-build,module-pack,typescript-config.uias a pre-1.0 component API.contractsonly as a transitive implementation dependency.core, the apps,module-ui-hostandmodule-templateare never published.module-databaseadapter.dependenciesand tooling and config indevDependencies.module-packpinned exactly.engines.node).LICENSE, noworkspace:ranges), installs them into a clean standalone module fixture, and proves build, package and verify before publishing.@ekklesia/*dependencies and its own lockfile; its CI never clones Ekklesia. The migration itself is a separate change.Relationship to other ADRs
Changes
docs/architecture/decisions/0053-standalone-module-development-packages.md(new, Proposed)Verification
pnpm verifypasses.🤖 Generated with Claude Code