v0.10.0
Minor Changes
-
46ed8dd: Let adopters choose how the admin console is hosted during
seamless init.The old "Include Admin Dashboard?" / image-vs-source prompts are replaced by a
single question with four options:- Served by your API at /console (recommended default) — the app backend
proxies the console via the SDK'screateSeamlessConsoleProxy, so it loads
from the API's own origin. The scaffold setsSERVE_ADMIN_CONSOLE=trueon the
API,SERVE_ADMIN_DASHBOARD=trueon the auth server, and adds the API origin
to the auth server'sORIGINSso console passkey ceremonies verify. No
separate admin container. - Separate container — official image or cloned source, as before, on
http://localhost:5174. - None — no console is scaffolded.
Each choice pre-configures the auth-server env, the app-backend env, the Docker
Compose services,seamless.config.json, the success output, andseamless checkaccordingly. Pins the auth API image tov0.3.0and the templates to
v0.3.0(which env-gate the console proxy). - Served by your API at /console (recommended default) — the app backend
-
e612a10: Enable
email_otpin the scaffolded auth server's default login methods.The auth server's own default (
passkey,magic_link) has no method the CLI can
drive without a browser authenticator, soseamless logincould not sign in to
a freshly scaffolded local stack.buildAuthEnvnow appendsemail_otpto
LOGIN_METHODS(composing with the OAuth method when providers are configured),
so email-OTP login works out of the box. -
7fbaff0: Enable
ALLOW_UNCREDENTIALED_DELIVERY_SECRETS=truein the scaffolded auth server env.Companion to the
email_otpdefault: with it set,seamless login --local
reads the OTP straight from the auth server's response instead of needing a mail
provider, so signing in to a freshly scaffolded local stack works end to end.
It's a dev-only escape hatch — the auth server ignores it under a production
NODE_ENV, and the scaffold runs as development.
Patch Changes
-
2e27156: Fix
seamless bootstrap-adminto target the app API instead of the login profile's auth server.The bootstrap invite route (
/auth/internal/bootstrap/admin-invite) and its
delivery are exposed by the app API (the SeamlessAuth server adapter), not the
auth server directly — the auth server does not serve that path. Previously
bootstrap-adminfell back to the active profile'sinstanceUrl, so once a
profile pointed at the auth server (asseamless loginand the admin commands
require), bootstrap requests 404'd.bootstrap-adminnow resolves its target independently of any profile:
--api-url <url>→SEAMLESS_API_URL→ the local defaulthttp://localhost:3000.
The--profileflag is removed from this command (it no longer affects the
target; the bootstrap secret is still resolved from the local project). -
3dbdc61: Reconcile documentation with actual behavior.
- README: correct the Node requirement (24, per
.nvmrc/engines, not 18);
updatebootstrap-admindocs to the--api-url→SEAMLESS_API_URL→
http://localhost:3000resolution (the removed--profileflag and
auth-server-profile wording are gone). - AGENTS.md: drop the
npm run typecheck/lint/format:checkcommands that
don't exist (there is no lint/format tooling yet); note the--filter=<flow>
(=form) forverify; list the instance-management commands; remove the stale
top-leveltemplates/reference (templates live in theseamless-templates
monorepo). package.json: drop the deadtemplatesentry fromfiles.
Closes #94.
- README: correct the Node requirement (24, per
-
e81a07d: Make
seamless checkmanaged-aware and resilient to partial config.checkComposedereferencedconfig.docker.composeFile, which isnullfor
managed projects, soseamless checkcrashed with aTypeErroron any managed
scaffold.checknow branches onservices.auth.mode === "managed": it validates
the remote instance's/health/statusand skips the Docker/compose/container
checks (which don't apply remotely). It also wrapsJSON.parseand guards missing
service entries so a malformed or partialseamless.config.jsonprints a friendly
message instead of a stack trace. The local console health check is derived from
services.admin.mode(image/source → :5174, api → :3000/console, none/hosted →
skipped).Closes #78.
-
c4a0f93: Fix the conformance adapter flows to match the SDK's POST OTP/magic-link routes.
@seamless-auth/expressnow serves OTP generate routes (and/magic-link) over
POST, but the harness adapter flows still called them with GET, so every adapter
spec failed atgenerate-email-otp -> 404once the stack came up. The adapter
flows now POST/auth/otp/generate-email-otp,/auth/otp/generate-login-email-otp,
and/auth/magic-link.Closes #111.
-
545aafc: Disable auth rate limits in the conformance stack.
The conformance suite drives many OTP/registration/magic-link flows from a single
IP and trips auth-api's dedicated per-IP limiters (whichRATE_LIMITdoesn't
tune), so the adapter layer failed with 429s once the stack came up. The verify
compose now setsDISABLE_AUTH_RATE_LIMITS=trueon the auth-api service — a
dev-only flag (ignored underNODE_ENV=production) added in seamless-auth-api.Requires seamless-auth-api with
DISABLE_AUTH_RATE_LIMITSsupport; conformance
builds it from source, so no release is needed. -
f7e5b5d: Fix the conformance stack and surface container logs on failure.
auth-api 0.3.0 requires
FRONTEND_URLat startup (a required system config), which
the verify compose never set — so the auth-api container exited on boot and every
conformancerun (here and in sibling repos calling the reusable workflow) aborted
with a bare "docker failed" before any layer ran.verify/docker-compose.verify.yml
now setsFRONTEND_URL, andseamless verifydumps recent container logs on a
setup failure so a container that exits on startup is diagnosable instead of hidden.Closes #107.
-
54f1f02: Quote generated
.envvalues that a dotenv parser would otherwise misread.writeEnvwrote bareKEY=value, so a value containing#, whitespace, quotes,
a backslash, or a newline (e.g. a managedAPI_SERVICE_TOKENor a pasted OAuth
secret) produced a.envthat dotenv truncates or mis-parses. Values that need
it are now double-quoted and escaped, andparseEnv/parseEnvStringunquote on
read so the CLI round-trips its own output. Simple values (tokens, URLs, hex
secrets) are still written bare.Closes #81.
-
943d13d: Harden the managed
initflow.- Explicit managed intent no longer silently scaffolds local. When
--appis
given but there is no usable session (expired or control plane unreachable),
initnow fails with an actionable message instead of quietly scaffolding a
self-hosted project and ignoring the flag. Without--app, a missing session or
an unreachable control plane falls back to local with a clear warning (rather
than aborting on transient network errors, as it previously did for non-reauth
failures). Closes #79. - Service-token rotation is now recoverable. Rotation invalidates the app's
previous token, so it runs after templates are copied (the likeliest failure
point), and every step after it is guarded: if scaffolding fails post-rotation,
the freshly issued token is printed so a deployed app can be re-wired instead of
left bricked. The same guard coversintegrateExistingProject. Closes #80.
- Explicit managed intent no longer silently scaffolds local. When
-
9eaaf0e: Fix the conformance adapter crash: the dev service token was too short.
seamless verifydefaultedAPI_SERVICE_TOKENto a 24-char constant, which the
adapter reuses as its cookie secret; a newer@seamless-auth/expressrejects a
cookieSecret shorter than 32, so the adapter container exited and conformance
failed after the stack came up. The dev service token and bootstrap secret
defaults are now >=32 characters.Closes #109.