Skip to content
DomainKit
Esc
navigateopen⌘Jpreview
On this page

CapsuleDB persistence

Provide PostgreSQL authorization persistence while retaining host ownership of clients, credentials, tenancy, and policy.

@domainkit/capsuledb is an optional PostgreSQL implementation of ManagedDnsConnections.Service. The package owns lifecycle migrations and concurrency semantics; your application owns the SQL client, credentials, tenant/domain bindings, startup, and policy.

Runtime composition

Construct one Effect PgClient from your existing pool. Provide that exact instance to Effect Drizzle, CapsuleDB’s registry preparation, and the capsule layer:

import { PgClient } from "@effect/sql-pg";
import { CredentialCustody, HostBindings, capsule } from "@domainkit/capsuledb";
import { Pg, makeRegistry, prepare } from "capsuledb";
import { Effect } from "effect";

const initialize = Effect.gen(function* () {
  const authorizationCapsule = yield* capsule;
  const registry = yield* makeRegistry({
    capsules: [authorizationCapsule],
    provider: Pg.profile,
  });

  yield* prepare(registry);
  return authorizationCapsule.layer;
});

Run preparation once per execution-environment startup before accepting API or workflow traffic. Do not prepare per request. If preparation fails, keep the entrypoint unready.

CredentialCustody.Service seals and opens StoredCredential values. It must preserve your current ciphertext and rotation/recovery behavior; never give the package keys or plaintext persistence.

HostBindings.Service resolves opaque owner and domain foreign-key references. Its methods execute inside the repository’s active transaction, so implementations can query host tables through Effect Drizzle over the same PgClient. The service must remain stateless and must not capture a request’s organization identity.

Ownership boundary

DomainKit package owns Host application owns
Authorization aggregate schema and migrations PgClient, pool, and connection lifetime
Atomic connect, attach, detach, rotate, and evidence updates Identity, tenancy, authorization, and consent
Durable revocation preparation and recovery Credential encryption, KMS keys, and audit policy
Semantic ManagedDnsConnections.Service Organization/domain tables and foreign-key policy

The package exports no tables, storage rows, Drizzle schema, or query handles. Promise consumers continue through domainkit/promise; persistence remains Effect-first.

Current provider scope

The first tracer supports PostgreSQL only. Transactional Bun SQLite and libSQL support may follow after the PostgreSQL contract is proven. D1 is deferred because bounded AtomicBatch execution cannot yet express the lifecycle’s locking and multi-phase revocation requirements.

Was this page helpful?