assay-engine vs Ory

assay-engine v0.2.0 ships a complete Ory replacement in one ~9 MB static binary. Same features as Kratos + Hydra + Keto stacked together, plus biscuit (Ory has nothing equivalent), plus a Temporal-replacement workflow engine in the same process.

Footprint

StackContainersCompressedRAM (idle)
assay-engine1~9 MB<50 MB
Ory Kratos1~120 MB~150 MB
Ory Hydra1~80 MB~100 MB
Ory Keto1~80 MB~100 MB
Ory Oathkeeper (optional)1~50 MB~80 MB
Postgres (shared)1~80 MB~200 MB
Ory total5~410 MB~630 MB

Feature matrix

CapabilityOryassay-engine
Identity (Kratos)
Password login (Argon2id)KratosYes — auth-password
WebAuthn / passkeyKratosYes — auth-passkey (webauthn-rs)
Cookie + CSRF sessionsKratosYes — auth-session
Federated SSO (OIDC client)KratosYes — auth-oidc (Google/Apple/GitHub/any OIDC)
Self-service password resetKratos flowsAdmin password-reset endpoint; UI flows on roadmap
TOTP / SMS MFAKratosRoadmap (v0.3.0)
SAMLKratosNot planned (open issue if you need it)
OAuth2 / OIDC OP (Hydra)
Authorization-code + PKCEHydraYes — auth-oidc-provider
Refresh tokensHydraYes (SHA-256 hashed at rest)
RFC 7009 token revocationHydraYes
RFC 7662 token introspectionHydraYes
OIDC discovery (/.well-known/openid-configuration)HydraYes
JWKS rotation (/.well-known/jwks.json)HydraYes — active + history in auth.jwks_keys
Back-channel logoutHydraYes (SSO session registry in auth.oidc_sessions)
Consent screen + per-(user, client) grantsHydraYes — auth.oidc_consents
Client CRUD via admin APIHydraYes — admin HTTP API + dashboard pane
Dynamic client registration (RFC 7591)HydraRoadmap
Authorization (Keto)
Zanzibar relation tuplesKetoYes — auth-zanzibar
check (subject ∈ relation(object))KetoYes — recursive CTE on PG18 + SQLite
expand (userset tree)KetoYes
lookup_resources / lookup_subjectsKetoYes — reverse-indexed
Namespace schema with computed-userset rewritesKetoYes — auth.zanzibar_namespaces
Caveats / temporal predicatesSpiceDB onlyRoadmap
Capability tokens
Biscuit / macaroonsNothingYes — biscuit-auth built-in (always-on)
Datalog-attenuable tokensYes
Offline verificationJWT-onlyBoth JWT + biscuit
Operations
Single binary deployment5 binariesYes — one process
SQLite backend (no DB server needed)NoYes — first-class via backend-sqlite
PostgreSQL backendYesYes — PG18 first-class
Cross-module atomic transactionsNo (each Ory app has its own DB)Yes — auth.usersworkflow.workflows in one TX
Built-in dashboard / admin SPAConsole (separate Cloud product)Yes — bundled, free, self-hosted
Lua scripting bindingsNoYes — assay.auth stdlib
Workflow engine in same binaryNoYes — Temporal-replacement, same process
Module enable/disable at runtimeNoYes — engine.modules table
Compile-time feature gates for slim buildsNoYes — fine-grained Cargo features

What's not in v0.2.0

Honest gaps to know about before swapping out Ory:

When NOT to use assay-engine

Otherwise, you're trading 5 containers + ~600 MB RAM for one ~9 MB static binary that does the same job, scripts in Lua, and runs your workflows too.

← Back to Auth & IdP overview