Configuration
Your dashboard is a file.
Every setting lives in signet.toml, in your git repository, and travels inside the engine. There is no toggle in a console you do not own. Every feature ships inside the one binary you run. Enterprise SSO (SAML and OIDC) is a build feature, on in the enterprise build.
# signet.toml: the whole configuration surface, in your repo.
# Secrets are env:/file: refs, never literals in the file.
[server]
base_url = "https://auth.example.com"
trusted_origins = ["https://app.example.com"]
[database]
adapter = "postgres" # your Postgres. A hosted console has no such key
# dsn supplied out-of-band via env:SIGNET_DATABASE_URL
[session]
expires_in = 604800 # 7 days, in seconds
fresh_age = 900 # step-up window for sensitive actions
[password]
min = 12
max = 128
min_strength = 3 # strength score 0–4; 0 keeps length-only compatibility
[rate_limit]
window = 10
max = 100
[[rate_limit.rules]]
path = "/sign-in/email" # throttle the door you most want bounded
window = 60
max = 5
[lockout]
max_failures = 5
window = 600 # seconds; state persists in Postgres
lock_duration = 900
backoff_multiplier = 2
max_lock_duration = 86400
[email_policy]
allow = ["example.com", "*.partners.example"]
block = ["blocked.example", "abuse@example.com"]
[disposable_email]
enabled = true
extra_deny = ["throwaway.example"]
# list_path = "/etc/signet/disposable.txt" # replaces bundled list
[plugins]
haveibeenpwned = true # breach-password check (HIBP)
[[social_providers]]
id = "google"
client_id = "env:GOOGLE_CLIENT_ID"
client_secret = "env:GOOGLE_CLIENT_SECRET"
[events]
url = "https://app.example.com/webhooks/signet"
secret = "env:SIGNET_EVENTS_SECRET" # must resolve to >=32 characters
# Generate the signing secret with: openssl rand -hex 32
[admin]
enabled = true # the /admin operator surface
# key supplied via env:SIGNET_ADMIN_KEYEvery setting, as a key.
Each row pairs a hosted-dashboard capability with the real signet.toml key that does the same job. Every key traces to the generated config reference a running instance serves from inside the engine. If it is not in that reference, it is not on this page.
| Hosted dashboard | signet.toml | What the key configures |
|---|---|---|
| Account lockout / cooldown | [lockout] | Persistent per-email failed-attempt state: max_failures, window, initial lock_duration, capped exponential backoff_multiplier, max_lock_duration, and lock_level_decay. |
| Email allowlist / blocklist | [email_policy] | Deny-first allow/block entries in exact-email, apex-domain, or *.subdomain form. Block wins; a non-empty allowlist then gates every address. |
| Disposable-email blocking | [disposable_email] | On by default for new identities with a versioned bundled list. Add extra_deny/allow carve-outs, or use list_path to replace the snapshot with a local one-domain-per-line file. |
| Rate-limit rules | [rate_limit] [[rate_limit.rules]] | A default window/max, plus one [[rate_limit.rules]] block per path (path, window, max): throttle /sign-in/email harder than the rest. |
| Social connections | [[social_providers]] | One block per provider: id, client_id, client_secret, the OAuth endpoints, and a pkce flag. google and github carry built-in defaults; a custom id declares its own endpoints. |
| Session lifetime | [session] | expires_in, update_age, and fresh_age, all in seconds. fresh_age is the step-up window that gates sensitive actions. |
| Password rules | [password] | min/max length (8–128 by default), opt-in min_strength (strength score 1–4; 0 disables enforcement), and the scrypt_concurrency cost factor. Clients can POST to /api/auth/password-strength for score and targeted feedback. |
| Breach-password protection | [plugins] haveibeenpwned | Toggle the Have I Been Pwned check; hibp_range_endpoint points it at a self-hosted mirror so even that lookup stays inside your walls. |
| Webhook endpoints (hosted: a third-party delivery add-on) | [events] | url and secret (HMAC, minimum 32 characters; generate with openssl rand -hex 32), with dead_letter for replay: the user.created, account.locked, session.created, and session.revoked event stream. |
| Email / SMTP settings | [delivery] [delivery.smtp] [delivery.smtp.templates] [delivery.webhook] | mode (smtp, webhook, or none) and dead_letter; SMTP connection + envelope fields and per-flow *_subject/*_body plain-text templates, or a signed-JSON webhook url/secret. |
| Allowed origins & paths | [server] | base_url, the API base_path, and extra trusted_origins for CORS and callback validation. |
| OAuth proxy | [plugins] oauth_proxy | A single toggle for the OAuth proxy plugin. |
| Admin / dashboard access | [admin] | enabled turns on the /admin dashboard and /admin/v1; the admin key (≥ 32 chars) is supplied out-of-band via SIGNET_ADMIN_KEY. |
| User impersonation & admin roles | [admin_plugin] | impersonation_session_duration time-boxes an impersonated session (default 3600s, 60–86400) and allow_impersonating_admins gates impersonating other admins; admin_roles, admin_user_ids, roles, and default_role decide who holds admin permissions. Every impersonation is audited. |
| Auto sign-in after sign-up | auto_sign_in (top level) | One boolean: sign a new user in immediately after sign-up rather than requiring a separate sign-in. |
| Where your data lives · no hosted equivalent | [database] | adapter, dsn, migrate, max_connections. A hosted dashboard has no such setting, because your users live in its database; here they live in yours. |
signet.toml key today. Every row traces to the generated reference a running instance serves from inside its own engine.Sources: the generated config-reference.md (from the *FileConfig structs) and our hosted-dashboard parity audit, retrieved 2026-07-21.
The file is the dashboard.
A file in version control has an author, a timestamp, a diff, and a history. A hosted dashboard does not.
signet.toml boots the same instance anywhere: on a colleague’s laptop, in CI, or on a sealed host with no route to anyone’s dashboard.Your users, sessions, and secrets in your own PostgreSQL. The configuration that governs them in your own repository. PostgreSQL settings →
The config travels with the engine.
Every deployed instance serves its own generated config reference at /docs: the same keys you see here, never drifted from the build you run. Get an instance and write the file.