v0.19 Release Notes
v0.19 is about making what Seamless Auth already does trustworthy and findable. It shipped as the auth API 0.19.0 security release on 2026-10-18 and the 0.19.x patches that followed, with matching releases of the SDKs, server adapters, admin dashboard, templates, and CLI. The versions that go together are in the Compatibility Matrix. Full details are in each package’s changelog and GitHub release.
Security
Section titled “Security”- Two advisories fixed in 0.19.0. GHSA-9jg2-jjqq-3346 (high): a magic link issued a session to whoever polled for it, more than once. Each link now issues one session, to the attempt that requested it, and a link opened on another device needs the person who opened it to confirm. GHSA-66gq-4pwg-33jq (medium): anyone could lock an account, and the lock blocked passkeys too. Passkey sign-in is no longer subject to lockout.
- Two older advisories disclosed. GHSA-2r8w-h4h9-jw8p and GHSA-7f64-r335-j842, both fixed in 0.8.0, are now published. The full list is under Published advisories.
- OAuth state bound to the client that started the sign-in (0.19.2).
/oauth/:providerId/startreturns abindingthat the callback must send back, so astateand code taken from one sign-in cannot be finished in another browser (login CSRF, RFC 9700 section 4.7). Found while writing the RFC 9700 matrix. - Stricter tokens. Access and pre-auth tokens must carry the issuer as audience and a
typ, and service tokens must expire within an hour. - Fail closed on a response schema mismatch. A response that does not match its declared schema is replaced with a generic 500 instead of being sent.
- Development mode refused on public hosts. The server will not start with
NODE_ENVother thanproductionwhenISSUERorAPP_ORIGINSnames a non-local host, unlessSEAMLESS_ALLOW_INSECURE_DEV=trueis set on purpose. - Shared secrets warned about. The server names each secret that falls back to the service token at boot. The fallback is removed in v0.20.
- IPv6 rate limits (0.19.2). The magic link, OTP and OAuth limiters key an IPv6 client on its /56.
- Dependencies (0.19.2).
follow-redirects1.16.1.
Never Stranded
Section titled “Never Stranded”- The last active admin can no longer be deleted, demoted, or delete themselves (
409 last_admin). - A user still cannot delete their last passkey, and device replacement recovery remains the admin path for a user who lost every credential.
Easier First Run
Section titled “Easier First Run”seamless initto a signed-in first admin without reading container logs:seamless owner-codeprints the owner’s registration code (CLI 0.24.0). Timed on clean Linux x64 and arm64 machines and a macOS machine.- Every template is on the current SDKs, and the starter dev containers no longer write root-owned files into your project on Linux.
- The bundled console at
/consoleno longer requests a missing/config.js, handles the cross-device magic link confirmation, and sends the OAuth binding (dashboard 0.10.1, API 0.19.3). seamless migrate entra-idimports users from Microsoft Entra ID (CLI 0.25.0).- The server adapters publish declarations that resolve under
NodeNext.
Honest Documentation
Section titled “Honest Documentation”- Security Posture and Threat Model, checked against the code at a pinned tag, including per-instance limits and accepted risks.
- OAuth Client and RFC 9700, row by row.
- Production Checklist.
- Container image signing and verification, and
SECURITY.mdwith thesecurity@fellscode.comcontact. - The Seamless Auth License Pledge and the governance document.
Choosing Seamless
Section titled “Choosing Seamless”- Comparisons with Auth0 (including Okta Customer Identity) and Keycloak, each with a “choose them if” section first and every competitor fact dated.
Upgrading
Section titled “Upgrading”- Server adapter first. Move to
@seamless-auth/expressor@seamless-auth/fastify0.21 or later,@seamless-auth/nextjs0.5 or later, or the current Go, Python or Rust adapter. They forward the pre-auth token the magic link fix relies on. - Client SDK with the API.
@seamless-auth/client0.7.1,@seamless-auth/react0.18.1,@seamless-auth/react-native0.3.3, or the Angular, Vue and Svelte bindings on client 0.7.1. React 0.18 makesAuthProvidercookie transport only in the browser. - The auth API, 0.19.3. It runs its migrations on start unless
RUN_MIGRATIONS=false. - Set the dedicated secrets (
REFRESH_TOKEN_LOOKUP_SECRET,TOTP_SECRET_ENCRYPTION_KEY,OAUTH_STATE_SECRET,DECOY_SUBJECT_SECRET) to the current service token value, so v0.20, which requires them, is a no-op. - If some clients cannot upgrade yet,
OAUTH_ALLOW_UNBOUND_STATE=truelets their OAuth callbacks through without a binding. It reopens login CSRF while set and is removed in v0.20. - A direct API integration (not through an SDK) has to keep the
bindingfrom/oauth/:providerId/startand send it with the callback. See OAuth Login.
Not In v0.19
Section titled “Not In v0.19”- FIDO certification is deferred to v1.0. v0.19 publishes self-validation results only.
- Step-up on admin configuration, role and deletion writes moves to v0.20.
- The OAuth state replay cache is still per instance (#414, v0.21).