Skip to main content

Access Control

A full authorization engine — define who can do what, enforce it everywhere, and prove it.

The model​

Everything lives inside a Scope. Scopes isolate tenants — what happens in the Marketing workspace stays in the Marketing workspace.

Inside a scope, you create Permissions — the smallest unit of access. documents:read → allow. billing:delete → deny. Permissions support wildcards and ABAC conditions.

Permissions are bundled into Roles. Instead of assigning 20 permissions per user, create a "Viewer" role once and assign it everywhere. Roles inherit from parent roles — "Content Editor" extends "Viewer" with write access.

An Access Policy connects a subject to a role in a scope. Alice is a Viewer in workspace-eng. A subject can have multiple policies across different scopes.

At runtime, an Access Check resolves policies, walks role hierarchies, applies deny-over-allow, and returns true or false. Single-digit milliseconds.

Every check is logged to the Audit Log — an append-only, HMAC-chained trail that an auditor verifies independently. No trust required.

Core concepts​

PageWhat it covers
ScopesTenant isolation, workspace hierarchy, inheritance
PermissionsResource:action pairs, wildcards, conditions
RolesBundling permissions, role inheritance, templates
Access PoliciesSubject-to-role binding, time-bounded grants
Access CheckRuntime evaluation, bulk checks, performance
API KeysMachine-to-machine auth, management vs application
Audit LogImmutable trail, verification, compliance export