Deployment Modes
The mwen.io issuer supports two operating modes: self-hosted and SaaS. The mode you choose determines how tenants, signing keys, and routing are managed. You select the mode at startup via an environment variable; the application behaviour changes accordingly.
Comparison
| Self-Hosted | SaaS | |
|---|---|---|
| Number of tenants | One | Many |
| Tenant routing | Single-tenant (no slug in URL) | Slug-based (/your-org/admin) |
| Signing key | You supply ISSUER_SIGNING_KEY (BYOK) | Derived per-tenant from ISSUER_MASTER_KEY via HKDF |
| Key storage | Your infrastructure | Platform secrets manager |
| Database isolation | Not required | PostgreSQL Row-Level Security (RLS) |
| Platform-admin API | Not available | Available at /api/platform-admin/tenants |
| Operator registration | First operator auto-promoted | First PLATFORM_ADMIN registers via browser extension |
| Typical deployer | One organisation running their own instance | A platform onboarding multiple issuing organisations |
Self-hosted mode
Self-hosted mode is controlled by setting SAAS_MODE=false (the default when the variable is unset).
In this mode the issuer operates as a single-tenant application. There is one organisation, one signing key, and one set of credential schemas. Tenant routing middleware is inactive — all requests are handled by the single-tenant fallback.
Best suited for:
- A government agency deploying a national ID issuer
- A university deploying a diploma credential service
- An enterprise deploying employee credential infrastructure
- Any organisation that runs its own infrastructure and wants to bring its own signing key
What you manage:
- The
ISSUER_SIGNING_KEY(a 32-byte hex secret). Generate it once; store it in your secrets manager. All credentials are signed with this key. - The PostgreSQL database. No RLS configuration required.
- The
NEXTAUTH_SECRETfor admin portal sessions. - Your
ISSUER_DID(adid:webpointing to your domain, e.g.did:web:issuer.yourorg.com).
What mwen.io provides:
- The OID4VCI protocol implementation
- The schema templates
- The revocation infrastructure (BitstringStatusList)
- The admin portal UI
SaaS mode
SaaS mode is enabled by setting SAAS_MODE=true.
In this mode the issuer is a multi-tenant application. Multiple organisations are each assigned a slug (e.g. acme-corp). Their admin portal is at /acme-corp/admin. Their OID4VCI credential issuance endpoints are namespaced to their tenant. Database rows are isolated by PostgreSQL Row-Level Security — one tenant cannot read another's data, even if both share the same database.
Best suited for:
- A platform that wants to offer credential issuance as a service to multiple organisations
- A government platform serving multiple agencies under one deployment
- A SaaS operator who manages the infrastructure on behalf of clients
What you manage:
- The
ISSUER_MASTER_KEY(a 32-byte hex secret stored in a secrets manager). Per-tenant signing keys are derived from this using HKDF — you never store individual tenant keys. - The PostgreSQL database with RLS policies (applied automatically by the migration runner).
- The
NEXTAUTH_SECRETfor admin portal sessions. - The platform-admin API for creating and managing tenants.
What mwen.io provides:
- All of the above plus multi-tenant routing, RLS enforcement, per-tenant HKDF key derivation, and the platform-admin API.
Security note: Rotating
ISSUER_MASTER_KEYinvalidates the signatures on all previously issued credentials across all tenants. Plan key rotation carefully and communicate with tenants before rotating.
Switching modes
Use the npm scripts to switch between modes in development. Each script copies the appropriate environment file to .env.local before starting the server.
# Switch to self-hosted mode
npm run dev:self-hosted
# Switch to SaaS mode
npm run dev:saas
The active mode is determined by the .env.local file. Switching modes overwrites this file.
For production deployments, set SAAS_MODE=true (or leave it unset for self-hosted) directly in your environment or secrets manager. Do not use the dev scripts in production.
Related pages
- Getting Started — first-time setup for self-hosted mode
- SaaS Onboarding — creating tenants in SaaS mode
- Configuration — full environment variable reference