Repository and workspace
Dirigible stores all user content in a single on-disk repository (also called the "registry" in older docs). The repository has two canonical roots: one for artefacts the runtime reconciles, and one for IDE workspaces where users edit.
Canonical layout
/registry/public/<project>/... # published artefacts (reconciled)
/users/<user>/workspace/<project>/... # IDE workspaces (drafts)Both roots are defined in IRepositoryStructure (modules/repository/repository-api/). Synchronizers scan only /registry/public/...; user edits in /users/.../workspace/... are invisible to the runtime until published.
Storage backend
The default backend is the local filesystem, rooted at ./target/ (override via DIRIGIBLE_REPOSITORY_LOCAL_ROOT_FOLDER). Other backends are pluggable via IRepository implementations in modules/repository/:
repository-local- filesystem (default)repository-master- read-only mirror of an upstream repositoryrepository-cache- optional caching layerrepository-search- Lucene-backed searchrepository-zip- import / export as zip
All of them expose the same IRepository / ICollection / IResource API, so user code reaches them uniformly through @aerokit/sdk/platform/repository-client.
How a path resolves
A file authored at MyProject/api/hello.ts ends up at:
- In the IDE workspace:
/users/admin/workspace/MyProject/api/hello.ts - After publishing:
/registry/public/MyProject/api/hello.ts - Served at:
/services/ts/MyProject/api/hello.ts
Publishing copies the file from the workspace to the registry; the synchronizer cycle then reconciles whatever it finds under /registry/public/... into runtime state.
Multi-tenancy
With DIRIGIBLE_MULTI_TENANT_MODE=true (the default), tenant-scoped artefacts are reconciled per tenant - see Multi-tenancy. The repository layout itself is shared (one /registry/public/... tree), but the synchronizer infrastructure walks artefacts on behalf of each tenant.
Programmatic access
From client code:
- JS / TS:
@aerokit/sdk/platform/repository-client,@aerokit/sdk/platform/workspace-client. - Java:
BeanProvider.getBean(IRepository.class)thenrepository.getResource(path)/getCollection(path)/createResource(...).
In HTTP-only integration tests, write fixture files directly via IRepository.createResource(...) and then call SynchronizationProcessor.forceProcessSynchronizers() to trigger reconciliation synchronously.
Reference
IRepository/IRepositoryStructure-modules/repository/repository-api/WorkspaceEndpoint,TransportEndpoint,PublisherEndpoint-components/ide/ide-workspace/