Authentication
you mount,
not maintain.
Voult is a hosted auth API for Node.js. Sign-up, login, sessions, OAuth, MFA and passkeys run on Voult. Your Express app mounts one router and gets back to its own features.
Overview
Created Sep 2, 2026 · Cookie sessions
Recent activity
LOGIN_SUCCESSada@example.com14:22SESSION_CREATEDada@example.com14:22TOKEN_REVOKEDlin@example.com14:18PASSWORD_RESETkofi@example.com14:09ACCOUNT_LOCKEDpriya@example.com14:02
Enabled methods
- Email + password
- Magic links
- Passkeys
- GitHub
- Microsoft
Users
Search by email or username| User | Status |
|---|---|
| Ada Okaforada@example.com | Active |
| Sam Riverasam@example.com | Active |
| Mei Tanakamei@example.com | Active |
| Kofi Mensahkofi@example.com | Active |
| Lin Chenlin@example.com | Active |
| Priya Nairpriya@example.com | Locked |
| Jonas Weberjonas@example.com | Unverified |
Sessions
Refresh tokens rotate on every use.
| User | Device | Last used | Actions |
|---|---|---|---|
| ada@example.com | Chrome · macOS | 2 min ago | Revoke |
| sam@example.com | Safari · iOS | 14 min ago | Revoke |
| mei@example.com | Firefox · Linux | 1 h ago | Revoke |
| kofi@example.com | Edge · Windows | 3 h ago | Revoke |
| lin@example.com | Chrome · Android | Revoked |
Sign-in methods
Enabled per app. Users can link several to one account.
Passwords & passwordless
OAuth providers
Redirect URI · https://api.voult.dev/api/oauth/<provider>/callback
Security
Policies and audit trail for this app.
| Time | Event | Risk |
|---|---|---|
| 14:22 | LOGIN_SUCCESS |
low |
| 14:22 | SESSION_CREATED |
low |
| 14:18 | TOKEN_REVOKEDRefresh token reuse detected, all sessions revoked |
critical |
| 14:09 | PASSWORD_RESET |
high |
| 14:02 | ACCOUNT_LOCKED5 failed password attempts |
medium |
API keys
Server-side only. Never ship these to the browser.
- Client ID
app_7f3c9e21b4d8a6- Client secret
- Stored hashed. Shown once when created or rotated.Rotate secret
- Callback URLs
https://acme.example/auth/callbackhttp://localhost:5173/magic-callback
# .env written by `npx voult init` VOULT_CLIENT_ID=app_7f3c9e21b4d8a6 VOULT_CLIENT_SECRET=•••••••••••••••• VOULT_SESSION_SECRET=(generated, 32 bytes)
Every field above maps to Voult’s data model. The values are sample data, and some of these views are still being built.
01Why Voult
Login is the smallest feature with the largest attack surface.
A sign-in form needs password hashing, token signing, refresh rotation, lockout, email flows, an OAuth callback per provider and an audit trail. Each piece is security-critical, and none of it is your product.
Built in-house18 modules to write, test and patch
- auth/password-hash.js
- auth/login.js
- auth/lockout.js
- auth/tokens/access-jwt.js
- auth/tokens/refresh-rotation.js
- auth/sessions/revoke.js
- auth/email/verify.js
- auth/email/reset-password.js
- auth/magic-link.js
- auth/oauth/google.js
- auth/oauth/github.js
- auth/oauth/…4 more providers
- auth/mfa/totp.js
- auth/mfa/backup-codes.js
- auth/passkeys/webauthn.js
- auth/audit-log.js
- middleware/rate-limit.js
- middleware/csrf.js
With Voult1 router
app.use('/api/auth',
createVoultRouter());
The same flows, served by Voult. Security fixes ship in the API, not in your codebase.
02How it works
Your users talk to your server. Your server talks to Voult.
@voult/express runs inside your app and holds the client secret. The browser only ever sees
httpOnly cookies. Here is a password login, end to end.
03What’s included
What Voult handles today, and what’s still coming.
Available In progress Planned
Sign-in methods
Every method lands in the same user record and the same session model.
-
Email + passwordbcrypt-hashed, strength rules enforcedAvailable
-
Username + passwordregister and log in by usernameAvailable
-
OAuthGoogle, GitHub, Microsoft, Apple, Facebook, LinkedInAvailable
-
Magic linkssingle-use, allowlisted redirect URIsAvailable
-
PasskeysWebAuthn registration and sign-inAvailable
-
Email verificationunverified accounts can’t log inAvailable
-
Password resetforgot / reset flow with emails sent by VoultAvailable
-
Account linkingconnect several providers to one userAvailable
Sessions & security
Secure defaults that are on for every app, not settings you have to find.
-
Access tokensshort-lived JWTs with token versioningAvailable
-
Refresh rotationreplaying an old token revokes every sessionAvailable
-
Session managementlist and revoke sessions per userAvailable
-
MFATOTP with backup codes and attempt limitsAvailable
-
Account lockoutafter 5 failed password attemptsAvailable
-
Rate limitingRedis-backed limits on sensitive endpointsAvailable
-
CSRF + headersCSRF tokens and Helmet security headersAvailable
-
IP allowlistsper app, with alerts for new IPsAvailable
-
Audit logevery auth event, tagged with a risk levelAvailable
Developer tooling
Published packages today; the rest is marked as in progress or planned.
-
Available
@voult/sdkJavaScript client for Node and the browser -
Available
@voult/expressmountable auth router, cookie or bearer sessions -
Available
@voult/clivoult initwrites .env and a session secret -
Developer dashboardapps, credentials, secret rotation, OAuth configAvailable
-
Documentationquick start and API referenceIn progress
-
Playgroundtry every flow against a real appIn progress
-
Planned
@voult/reacthooks and pre-built sign-in components -
Planned
voult doctorchecks your integration end to end
04Integration
What using Voult looks like.
No auth routes to write. Mount the router, and your frontend calls your own /api/auth endpoints.
- 1Create an app
The dashboard gives you a client ID and a secret, shown once.
-
2
Install and run
npx voult initWrites
.env(mode 0600) and.env.example, and generates your session secret.npm install express @voult/express @voult/sdk - 3Mount the router
Your app now serves these routes:
POST/registerPOST/email-loginPOST/username-loginPOST/sessions/refreshGET/user/mePOST/user/forgot-passwordGET/user/verify-emailPOST/mfa/verifyPOST/logout
Works with Express 4 or 5 and the Next.js App Router (14.2+), on Node.js 20.12+. Any frontend that can call fetch works too; the Voult playground is built with React and Vite.
import express from 'express';
import { createVoultRouter } from '@voult/express';
const app = express();
// Reads VOULT_CLIENT_ID, VOULT_CLIENT_SECRET and
// VOULT_SESSION_SECRET from the .env written by `voult init`.
app.use('/api/auth', createVoultRouter());
app.listen(3000);
// Cookie strategy: tokens live in httpOnly cookies, never in JS.
await fetch('/api/auth/email-login', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
});
const me = await fetch('/api/auth/user/me', { credentials: 'include' });
import voult from '@voult/sdk';
const auth = voult({
clientId: process.env.VOULT_CLIENT_ID,
clientSecret: process.env.VOULT_CLIENT_SECRET,
});
const result = await auth.signInWithEmailAndPassword(email, password);
if (result.mfaRequired) {
await auth.verifyMfaLogin(result.mfaPendingToken, code);
}
Real @voult/express and @voult/sdk APIs, as published on npm.
05Pricing
Pricing is published before launch.
We won’t list plans until they’re final. Questions about pricing or volume can come to us directly.
Contact us- Availability
- Not open for sign-ups yet. Launch is planned for early 2027; no exact date yet.
- Included
- The full auth API, the
@voult/*npm packages, the dashboard and audit log - Plans
- Published before public launch
Stop maintaining login code.
Voult is in active development and launching early 2027. The packages are on npm, and we’re happy to talk.