Adapters

Every seam, a folder.

The kits stay narrow by pushing integrations to the edges: payment providers into billing-kit-adapters, enterprise identity and RBAC engines into tenant-kit-adapters. Statuses below are honest to the repos today — a tile is never a roadmap.

CoreShippedCompatiblePR welcome

Payments in

BillingProvider — settlement, capture, refunds, webhooks. billing-kit branches on capabilities, never a provider name.

StripeCore

Settlement, capture, refunds, verified webhooks — ships in billing-kit.

PaddleCore

Merchant-of-record settlement; the provider’s number is authoritative.

ChargebeePR welcome

The BillingProvider contract and conformance testkit are waiting.

RecurlyPR welcome

Same contract; the template typechecks before you write a line.

BraintreePR welcome

Same contract, same testkit, same review checklist.

Your providerPR welcome

cp -r adapters/_template — idempotency is the rule the review checks first.

Identity in

SsoResolver — a verified assertion becomes a membership-checked ResolvedTenant. Adapters never verify credentials.

OktaCompatible
via sso-oidc

Per-tenant connections, group→role mapping, JIT provisioning.

Microsoft EntraCompatible
via sso-oidc

Shared-issuer multi-tenant routing via the tid claim predicate.

KeycloakCompatible
via sso-oidc

Any OIDC issuer routes by exact match — lookalikes have a test.

Google WorkspaceCompatible
via sso-oidc

Verified ID-token claims in; ResolvedTenant out.

identity-kitShipped
via oidc seam

The family’s own issuer — first-party tokens for fromClaim.

SAML IdPsCompatible
via sso-oidc

A verified assertion maps to VerifiedIdentity; no separate adapter needed.

Provisioning in

ScimDirectory — the enterprise directory pushes membership; offboarding offboards, last_owner answers 409.

Okta provisioningShipped
via scim

Lookup-then-create, replay convergence, deactivate-as-offboard.

Entra provisioningShipped
via scim

The SCIM 2.0 Users subset the major IdPs actually drive.

OneLoginCompatible
via scim

Any SCIM 2.0 client speaks to the same framework-neutral handler.

Roles out

RoleBridge over a TupleStore — memberships mirrored as convergent desired-state sync; unexplained grants die on the next pass.

OpenFGAShipped
via openfga

One direct tuple per membership; inheritance lives in the model.

SpiceDBCompatible
via TupleStore

Same 3-method store contract; convergent desired-state sync.

Your enginePR welcome
via RoleBridge

Anything storing subject–relation–object triples fits the seam.

The contracts and the review checklist, in the docs →