@objectstack/plugin-org-scoping
v9.3.0
Published
Organization-Scoping Plugin for ObjectStack — row-level Organization isolation, per-org seed replay, default-org bootstrap
Downloads
4,469
Maintainers
Readme
@objectstack/plugin-org-scoping
Row-level Organization isolation for ObjectStack — the LOGICAL multi-tenant building block.
@objectstack/plugin-org-scoping makes sys_organization a first-class row-level scope:
- Insert auto-stamp — fills
organization_idfromExecutionContext.tenantIdon every authenticated insert (when the target object declares the column). - Per-org seed replay — every
sys_organizationinsert triggers a copy of the app's demo dataset into the new org (viaseed-replayer, or fallbackclaimOrphanOrgRows/cloneOrgSeedData). - Default-org bootstrap — the first platform admin gets a
Default Organization(slugdefault) bound asowneronkernel:ready, so the dashboard isn't empty after first sign-up.
Pair with @objectstack/plugin-security for full multi-tenant RBAC + RLS + Field-Level Security. Standalone install gives a single-tenant deployment.
Naming
The word "tenant" in ObjectStack means physical isolation (one Environment = one database, per ADR-0002 and @objectstack/driver-turso's multi-tenant router). This plugin is about logical row-level scoping inside a single database — orthogonal to physical tenancy. Hence "org-scoping", not "multi-tenant".
Install
pnpm add @objectstack/plugin-org-scoping @objectstack/plugin-securityUsage
import { OrgScopingPlugin } from '@objectstack/plugin-org-scoping';
import { SecurityPlugin } from '@objectstack/plugin-security';
// OrgScopingPlugin MUST be registered BEFORE SecurityPlugin — the
// latter probes `getService('org-scoping')` at start time to decide
// whether to keep wildcard `current_user.organization_id` RLS policies.
await kernel.use(new OrgScopingPlugin());
await kernel.use(new SecurityPlugin());Or via the OS_MULTI_TENANT env switch when using @objectstack/runtime / @objectstack/plugin-dev:
OS_MULTI_TENANT=true objectstack serveOptions
new OrgScopingPlugin({
ensureDefaultOrganization: true, // default — auto-create slug="default" for first admin
});Set ensureDefaultOrganization: false to fully self-manage onboarding via invitations / a custom UI.
See also
- ADR-0002 — Physical multi-tenancy & driver-turso router
@objectstack/plugin-security— RBAC, RLS, Field-Level Security
