ObjectStack ships as a single version-locked train: every @objectstack/*
package (and the bundled @objectstack/console frontend) is in the changesets
fixed group, so one number describes the whole platform. That number is the
@objectstack/spec major — the same value as PROTOCOL_VERSION.
Because the release history spans ~70 backend packages and a separately-developed frontend, it is maintained in three layers. Each layer has exactly one owner (generated or curated) — never a hand-maintained aggregate, which is what drifts.
write time: backend PR → .changeset/*.md
objectui bump → .changeset/console-*.md (auto, see below)
│ pnpm changeset version (release pipeline)
▼
detail layer: packages/*/CHANGELOG.md ← generated, never hand-edited
│ curate per major (backend + frontend)
▼
platform layer: content/docs/releases/vN.mdx ← the whole-platform big picture
Every behaviour-changing PR adds a .changeset/*.md describing the change and its
migration while the context is fresh. This is the only place humans write
release history for the backend. pnpm changeset version fans these out into the
per-package changelogs and computes the next platform version.
Generated by changesets, with PR links. Never hand-edit these. They are the exhaustive, per-package record for integrators and npm.
The Console UI is developed in the sibling objectui
repo and bundled into @objectstack/console at a pinned commit recorded in
.objectui-sha. A SHA bump alone used to leave no trace in
the history. scripts/bump-objectui.sh now closes that gap: on every bump it emits
a @objectstack/console changeset summarising the objectui OLD_SHA..NEW_SHA
commit range (auto-typed minor if the range contains any feat, else patch).
So frontend deltas flow through the same pipeline as the backend — they land in
@objectstack/console's changelog and roll up into the platform version.
scripts/bump-objectui.sh # bump to ../objectui HEAD, write the changeset, commit
scripts/bump-objectui.sh <sha> # bump to an explicit commit
CONSOLE_BUMP=patch scripts/bump-objectui.sh # force the bump type
scripts/bump-objectui.sh --no-changeset # opt out (rarely)The curated, developer-facing "big picture", written for third parties building on ObjectStack. One page per major, leading with breaking changes + migration, then new capabilities, then notable fixes — and a Console (Studio) section covering the frontend changes bundled in that line. This is the layer the whole platform version maps to.
Cadence that scales with rapid iteration:
- Major (breaking): a hand-curated
vN.mdxis mandatory — migration guidance can't be generated. - Minor / patch: do not add a page each. Fold them into the current major's page under a "What's new in N.x" running section, or leave them to the generated per-package changelogs.
Backend content comes from the spec/package changesets. Frontend content comes from
objectui's history for the SHA range bundled in that release. Because .objectui-sha
is version-controlled, scripts/objectui-range.mjs computes that range from any two
framework revisions and prints the feat/fix commits grouped by type + the largest
touched areas — ready to paste into a Console section:
# frontend delta bundled between two framework revisions (needs ../objectui)
node scripts/objectui-range.mjs <old-rev> <new-rev> # e.g. the two release commits
node scripts/objectui-range.mjs --from <sha> --to <sha> --json # explicit SHAs / toolingWithout an objectui checkout it still prints the SHA range to inspect. The framework changesets also embed companion frontend notes inline ("Companion objectui PR ships…", renderer notes), which are enough to write an accurate Console section on their own.
scripts/check-release-notes.mjs (run in CI as pnpm check:release-notes) fails the
build when a released spec major has no content/docs/releases/v<major>.mdx wired
into that section's meta.json. This is what prevents the "docs stuck at v9 while
the platform shipped v14" gap from recurring. Curated pages started at v9; v10/v11
were never backfilled and are the documented exceptions in the guard.
Root CHANGELOG.md and RELEASE_NOTES.md were hand-maintained platform aggregates
and drifted. They are retained for their historical entries but are superseded
by the three layers above — prefer the per-package changelogs (detail) and the
release pages (narrative) for anything new.