Overview
Release notes for the ObjectStack platform — framework packages and the Console UI, summarized per version for app and plugin developers.
ObjectStack ships as a single release train: all @objectstack/* packages are
version-locked, so one version number describes the whole platform. The
Console UI (built from the objectui
repository) is frozen into @objectstack/console at release time, so each
release note here also covers what changed in Studio/Console. ObjectStack
Cloud (the hosted service) versions independently and deploys continuously —
developer-facing Cloud changes are summarized in the release note for the
framework version they accompany.
Each release page is written for third-party developers building apps, plugins, or clients on ObjectStack. It leads with breaking changes and migration steps, then covers new capabilities and notable fixes.
Versions
- v18 — The line that carries ADR-0131, total organization ownership with no NULL
organization_id; its breaking changes landed in stages through the18.0.0-next.Nprereleases on npm'snexttag, each with its own changeset and migration, and its GA release, 18.0.0, publishes to npm'slatesttag and moves it from 17.x to 18 (current series: 18.2.0, released 2026-10-27). - v17.0.0 — Files become owned
sys_filerecords with server-enforcedaccept/maxSizeand a governed download path, bulk export becomes its own opt-in privilege, the SDK is reconciled against the routes the server actually mounts (21 dead methods out, 40+ real ones in), approval nodes route approvers dynamically via CEL expressions and decision outputs, a datasource that cannot connect fails the boot, and Node 22 becomes the supported floor; 17.1 adds partial field masking, record-view auditing onsys_audit_log, and a per-object read-only approval visibility tier — and makes a deactivated permission set or position actually stop granting access, withdraws the bulk-export wildcard from the shipped admin sets, and gives all three flow doors one honest HTTP status table; 17.2 tightens by-idupdate/deleteagainst a silently-droppedwherepredicate or a mismatched id, retiressys_position.permissionsand other dead ADR-0049 surfaces, and stops analytics from answering the wrong number on a cross-object filter (final release: 17.7.0). - v16.0.0 — One org identifier (
organizationId) across hooks and actions, quorum + per-group sign-off (会签) approvals with metadata-declared decision actions, time-relative automations, filtered roll-ups, strict dashboard widgets, an identity-scoped MCP stdio transport, and a platform-wide enforce-or-remove sweep that makes dead metadata loud; 16.1 adds arequirescapability-provider preflight, two more dashboard build gates, andrunAs:'user'automations that run with the triggering user's real grants (final release: 16.1.0). - v15.0.0 — Explain record access layer by layer, a docked AI workspace in the Console, project-ready Gantt charts, and phone sign-in; 15.1 adds permission-following attachments, no-code third-party connectors, dashboard-wide filters, pinyin search, and whole-record inline editing — with materially safer multi-tenant and write-path defaults (final release: 15.1.1).
- v14.0.0 — ADR-0090 vocabulary convergence completed, object
enable.*flags become real gates, admin user management, phone/SMS auth, book-audience enforcement, data-lifecycle contract, and effective-dated grants (final release: 14.8.0). - v13.0.0 — Permission Model v2 (ADR-0090): Roles and Profiles converge on Positions, custom objects default to private, plus an explain engine, delegated administration, and self-serve MCP OAuth.
- v12.0.0 — Anonymous data access denied by default (ADR-0056 D2), adaptive record surfaces, an enforced protocol-version handshake, and build-gating author-time lints.
- v9.0.0 — Analytics single-form cutover (ADR-0021), honest chart taxonomy, canonical
OS_*settings env vars, Google sign-in, AI build experience.
Curated notes for v10 and v11 are not yet written; consult the per-package
CHANGELOG.mdfiles for those versions in the meantime.
Where the fine-grained changelogs live
These pages are curated summaries. For exhaustive, per-package detail:
- Framework packages — every package ships a
CHANGELOG.mdgenerated from changesets, visible on npm and in the framework repository. - Console UI — the objectui CHANGELOG follows Keep a Changelog.
- Design decisions — breaking changes reference their ADRs, which record the rationale.
Versioning policy
ObjectStack follows Semantic Versioning. All
@objectstack/* packages version in lockstep, so a single major bump promotes
the whole platform, and which version a breaking change ships in depends on
the line.
The 17.x minors ran under a launch-window override: a breaking change
shipped as a minor release. It landed in a minor alongside a changeset
entry marked **BREAKING**, and scripts/check-changeset-no-major.mjs
failed a pull request that declared a major bump.
The v18 line is a major, and 18.0.0 is its GA release. While Changesets
was in pre mode with the tag next, check-changeset-no-major.mjs stood
aside, so a pull request could declare a major bump, and every release cut
from main was the next 18.0.0-next.N on npm's next tag while latest
stayed on 17.x. Changesets has left pre mode for the 18.0.0 cut, which
publishes to npm's latest tag, and the guard again fails a pull request that
declares a major bump. See
how a breaking stage lands on the v18 line.
After 18.0.0, the level follows the metadata protocol. The maintainer's
2026-10-21 ruling (#25105)
keeps the no-major guard and grades every changeset by what it does to the
metadata protocol: a key, value or metadata type added, narrowed or given a new
meaning takes minor, and every other change takes patch — a REST door, a
driver, a boot refusal, the CLI or the Console — breaking or not. A
non-protocol breaking change keeps its **BREAKING** banner and its ADR-0087
disposition. 18.1.0 is the first release cut under the rule: a minor carrying
91 changesets declared breaking, 43 of them graded patch.
What that means when you read a version number:
- A major release may remove or change schemas in
@objectstack/spec, public APIs, CLI flags, or environment variables — always with a migration path documented in the release notes. - A minor release adds capabilities, and may also remove or change those
same surfaces.
17.2.0retiredhttp_request_errors_totalandsys_position.permissions;15.1.0removedtenancy.strategyandtenancy.crossTenantAccess— all in minor releases. As the v17 notes put it, 17.1.0 and 17.2.0 are minors by version number, not by blast radius. - A patch release fixes bugs. On the v18 line after 18.0.0 it may also carry a breaking change to anything that is not the metadata protocol: a REST response, a boot refusal, a CLI exit status, a removed runtime export.
⚠️ The version number is not the upgrade-safety signal. Read the release note for the version you are moving to — each one leads with breaking changes and migration steps — and see Backward Compatibility for the full policy.
Bulk Action
The vocabulary of a list view's bulkActionDefs — one entry per button in the multi-select toolbar.
v18
The v18 line and its GA release, 18.0.0, which closes the `18.0.0-next.N` prerelease train and publishes to npm's `latest` tag. It carries ADR-0131 (organization ownership is total, with no NULL `organization_id`) and landed its breaking changes in stages, each with its own migration.