Repository navigation
Releases: zitadel/nextgen
Release list
Zitadel NextGen v0.4.0
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: 72bf4dcf3ce6
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:0.4.0 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
0.4.0 |
@zitadel/server |
0.4.0 |
@zitadel/server-linux-x64 |
0.4.0 |
@zitadel/server-linux-arm64 |
0.4.0 |
@zitadel/server-darwin-x64 |
0.4.0 |
@zitadel/server-darwin-arm64 |
0.4.0 |
@zitadel/server-win32-x64 |
0.4.0 |
@zitadel/api |
0.4.0 |
@zitadel/config |
0.4.0 |
@zitadel/components |
0.4.0 |
@zitadel/sdk-core |
0.4.0 |
@zitadel/sdk-next |
0.4.0 |
@zitadel/sdk-nuxt |
0.4.0 |
@zitadel/sdk-react |
0.4.0 |
@zitadel/sdk-vue |
0.4.0 |
@zitadel/sdk-angular |
0.4.0 |
@zitadel/sdk-solid |
0.4.0 |
@zitadel/sdk-svelte |
0.4.0 |
@zitadel/sdk-qwik |
0.4.0 |
@zitadel/sdk-sveltekit |
0.4.0 |
@zitadel/sdk-solid-start |
0.4.0 |
@zitadel/sdk-qwik-router |
0.4.0 |
@zitadel/sdk-tanstack-start |
0.4.0 |
@zitadel/testing |
0.4.0 |
Package Changes
Minor Changes
-
@zitadel/cli,@zitadel/api,@zitadel/sdk-core: #235779d8dd0- The server SDKs'/__nextgenproxies and the dev proxieszitadel setupwrites for single-page apps now recognize the session calls under/api/v1as well as at their current paths, so sign-in keeps working once the API moves under/api/v1.zitadel doctorwarns about a dev proxy an earlierzitadel setupwrote, andzitadel doctor --fixupdates it. If you wrote your own production proxy for a single-page app, have it add the project secret toPOST /api/v1/sessions/exchangeas well asPOST /sessions/exchange.@zitadel/apiexportsAPI_PREFIX, the path the API moves to. -
@zitadel/cli: #24643481a07-zitadel deployandzitadel previewrecord a message when-mis omitted: a GitHub pull request's title, Vercel's commit message, or the current commit's subject on a clean worktree, so a CI run no longer needs-m.zitadel preview -mandzitadel deployment rollback -mrecord a message of their own, and a blank or over-long-mis refused. -
@zitadel/cli: #2439d277b8f-release listshows when each release was created,release getshows the resources a release pins, anddeployment getshows the variables the deployment froze. -
@zitadel/cli: #2487bf6ce2e-zitadel skills addgives your project's coding agents the Zitadel skills of the CLI version you run, for Claude Code and most other agents, and the note aftersetupnow names it (Agent setup). -
@zitadel/cli,@zitadel/server,@zitadel/api,@zitadel/sdk-core,@zitadel/sdk-next,@zitadel/testing: #2359eb363f0- The SDKs, the login components, the console and thezitadelCLI now call the API under/api/v1, where the server serves it.@zitadel/api's client puts/api/v1after the proxy path or server origin it is given, and keeps a single prefix when the origin already ends in it.zitadel apitakes a path with or without the prefix and shows the full URL with it. A call the server knows no operation for now says the server may be older than the client.Breaking: clients from this release need a server that serves
/api/v1, so upgrade a self-hosted server before the apps that call it. In a single-page app set up by an earlierzitadel setup, runzitadel doctor --fix: the dev proxy it wrote adds the project secret only to the old path of the session exchange, so sign-in fails until it is updated, andzitadel doctornow fails on it. A production proxy you wrote for a single-page app must add the project secret toPOST /api/v1/sessions/exchange. Until 1.0.0 the server also answers every operation at its old path, with aDeprecationheader. -
@zitadel/cli,@zitadel/server,@zitadel/api,@zitadel/components,@zitadel/sdk-core,@zitadel/sdk-next,@zitadel/sdk-nuxt,@zitadel/sdk-sveltekit,@zitadel/sdk-solid-start,@zitadel/sdk-qwik-router,@zitadel/sdk-tanstack-start,@zitadel/testing: #2488db05fbb- The session cookie is now__Host-zitadel_session, which a browser accepts only from Zitadel's own host over https, so another site under the same domain can no longer plant a session. Onhttp://localhostit iszitadel_session, so sign-in keeps working in Safari. An app's own, behind a server SDK or dev proxy, adds_<project id>.Breaking: every browser signs in again: cookies named
__nextgen_sessionare no longer read. Update the server, the server SDKs, the CLI and@zitadel/testingtogether; an SDK from before this release keeps no session with this server, nor the other way round. In@zitadel/testing,SESSION_COOKIE_NAMEis__Host-zitadel_session, andsessionCookieName(projectId, url)and the newbrowserSessionCookieName(url)name the cookies for the app's URL.zitadel doctorfails on the dev proxy of a single-page app set up before this release untilzitadel doctor --fixupdates it. -
@zitadel/cli: #2461b2d9cb9-zitadel setupdeploys.zitadel/to the app's origin once it has committed the project, so the sign-in it asks you to verify is served the release it built.data.deploymentreports what it deployed, and a failed deploy is a warning whosenext_commandslead with thedeploythat fixes it. -
@zitadel/cli,@zitadel/api,@zitadel/config,@zitadel/testing: #25270a00b60- Every paged list method of the@zitadel/apiclient now hasitems(),pages()andall(), which follow the cursor for you, andcreateZitadelClienttakesonResponseandonErrorhooks;@zitadel/api/clientexportspagedFunctions, each paged function's typed readers of a page's items and cursor and the arguments of its next page. The CLI no longer stops--all, the resource list commands orzitadel api --paginatewhen a server sends the same page cursor twice: that is a server bug, and the client trusts the paging contract.deploy,preview,release createandsetup's first deploy check the release body against the API's own schema before sending it, and name each field it refuses.@zitadel/testingno longer re-checks the ids the server answers its bootstrap and seeding with, and typesBootstrappedProject.previewSecretas always present, as the server always issues one.@zitadel/config'sgetDefaultHumanUserSchemais typed as the user schema document it returns,$idincluded, and exports that type asUserSchemaDocument;getDefaultHumanUserSchemaBodyreturns it without$id, as an inline schema in a release bundle must be. -
@zitadel/server: #233502677c2- The console's release detail shows a pinned policy revision: a Policies group with the policy's settings summarised above the document the CLI publishes. -
@zitadel/server: #24473f4da33- The user schema screen lists every revision of the schema, newest first and marked latest, and opens any of them read-only. An older revision says that users stay on the revision they were created on until they are migrated, and links the migration guide. -
@zitadel/server,@zitadel/api: #239826097dd- Deleting a user who is the last active member of a project's owning team now fails with409 proj.last_ownerand changes nothing. The message names the projects and says to add another member to that team, then retry.details.details.project_idslists the same ids. Admin grants stay freely revocable, suspending or deactivating a user is still allowed, and a project whose owning team already has no active member is left alone. -
@zitadel/server: #24693b43b2c- The platform project is now deployed like any project: console sign-in is served a release of the configuration the server ships, inc...
Zitadel NextGen v0.3.0
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: de7a14bf7c1d
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:0.3.0 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
0.3.0 |
@zitadel/server |
0.3.0 |
@zitadel/server-linux-x64 |
0.3.0 |
@zitadel/server-linux-arm64 |
0.3.0 |
@zitadel/server-darwin-x64 |
0.3.0 |
@zitadel/server-darwin-arm64 |
0.3.0 |
@zitadel/server-win32-x64 |
0.3.0 |
@zitadel/api |
0.3.0 |
@zitadel/config |
0.3.0 |
@zitadel/components |
0.3.0 |
@zitadel/sdk-core |
0.3.0 |
@zitadel/sdk-next |
0.3.0 |
@zitadel/sdk-nuxt |
0.3.0 |
@zitadel/sdk-react |
0.3.0 |
@zitadel/sdk-vue |
0.3.0 |
@zitadel/sdk-angular |
0.3.0 |
@zitadel/sdk-solid |
0.3.0 |
@zitadel/sdk-svelte |
0.3.0 |
@zitadel/sdk-qwik |
0.3.0 |
@zitadel/sdk-sveltekit |
0.3.0 |
@zitadel/sdk-solid-start |
0.3.0 |
@zitadel/sdk-qwik-router |
0.3.0 |
@zitadel/sdk-tanstack-start |
0.3.0 |
@zitadel/testing |
0.3.0 |
Package Changes
Minor Changes
-
@zitadel/cli,@zitadel/config: #23531f44571-zitadel policies testruns the cases in.zitadel/policies/<operation>.test.jsonagainst your policy. Each case gives the operation's input (for the password policy, the password itself), optionally the facts the operation would look up (self_service,history_matches), and the decision it expects:allowed, and optionally the errorcodeand exactly theviolations. Zitadel evaluates every case as a real password set would, so a case also covers how the password is counted. By default the cases run against the policy file beside them;--release <id>runs them against the policy a built release pins, before you deploy it. A failing case fails the command withE_VALIDATIONand lists what was expected and what Zitadel decided.deploynever carries test files, editors validate them against the new.zitadel/meta/policy-test.json, and the policies README thatsetupwrites shows an example. -
@zitadel/cli: #24282d32dbc- The usage analytics events the CLI sends to Vercel Web Analytics now carry one property of the command's own forsetup(framework),claim(claim_outcome),doctor(failed_checks),api(operation) andstart(runtime). On a failed run it takes the place ofnon_interactive. The kind of data sent does not change: fixed names only, never a path, id or message. -
@zitadel/cli: #22881cab16f-zitadel deploy --dry-run --jsonnow reports what the deploy would change, so a script or an agent can review it before deploying:data.difflists each changed file under.zitadel/with its status and its part of the diff the terminal shows, against the release your primary origins serve.zitadel deploy --jsonreports the same diff for what it deployed. -
@zitadel/cli,@zitadel/server,@zitadel/api: #2129ae0f5eb-POST /users/querycan find the users still on an older revision of a schema. The newschema_object_typefilter field matches the object type every revision of a schema shares, withequals,not_equalsandcontains, andschemanow acceptsnot_equals, soschema_object_typeequalsa type together withschemanot_equalsits newest revision lists the users left to migrate.zitadel users list --filteracceptsschema_object_type. -
@zitadel/cli: #23217722728-setupnow commits the project it scaffolds, initialising a repository first when there is none, so a release records the commit it was built from and a laterdeploycan show a real diff. Because the commit covers the project directory, setup refuses a repository that already has uncommitted work, untracked files included; only the.zitadel/local/and.gitignorethatstartleaves are exempt. It also points at thedeploythat pins.zitadel/into a release.--no-gitopts out of the commit. -
@zitadel/server: #23374e481af- The server's API request metrics (ogen.server.request_count,ogen.server.errors_count,ogen.server.duration) now carry only the operation, method, route template and status code, so a request path with an id in it can no longer become a time series of its own. The configuration guide gains a Metrics section that lists every instrument the server reports throughinstrumentation.metric, with its attributes and their values, and documents the bound every instrument already had: at most 2000 series, past which new attribute combinations are counted on one series markedotel.metric.overflow=true. That bound is now covered by a test. -
@zitadel/server: #2365556ace1- The Console's project page has an Overview tab and an Admins tab. Overview holds the project's name, its origins and its variables and secrets: origins can be added, edited and removed from the page, and variables are listed with the value each kind holds, a secret showing only that it is configured. Admins moves to its own tab. The projects list's row menu opens the page as "View project". -
@zitadel/server: #23904068176- The console's project page shows the project's password policy: the minimum length and the password history in force, with a warning when the minimum is under the recommended 15 characters. -
@zitadel/server: #23384cd4d57- The server now measures its database work:db.client.operation.durationtimes every storage statement, labelled with the database and the statement method that issued it, anddb.client.connection.countanddb.client.connection.maxreport the PostgreSQL and SQLite connection pools by state. Both are listed in the configuration guide's Metrics section. -
@zitadel/server: #2397a6fb3ce- A server that runs only while it serves a request, such as a Vercel function, can now leave the purge of expired audit events to a scheduler outside it. Setevents.retention.trigger_secretto at least 16 characters: the server then stops its hourly purge and runs one each time/cron/events-retentionis called with the secret as a bearer token. Without the setting, the server purges hourly as before. -
@zitadel/server: #23501ddde86-POST /policies/evaluateevaluates an operation's policy as a dry run: it takes a config, the operation's input (for the password policy, the password itself) and the facts the operation would look up (self_service,history_matches), and answers whether the operation would go ahead. A refusal carries the error code and violations the live operation answers with, such asuser.password_policy_violationwith{"min_length": 12}oruser.password_empty, because the server runs the password set's own check, NFC normalization and the 64-character cap included. Nothing is read from or stored in the project; an invalid config is refused withpol.invalid, as on publish. -
@zitadel/server,@zitadel/api: #2129ae0f5eb-GET /schemasacceptsexpand=in_use, which addsmetadata.in_useto each listed revision: whether any user of the project is on it. The flag is absent unless asked for, and needs read on the whole project, plususer.readfor a token. Users are now indexed by schema, so the check and theschemafilter onPOST /users/queryno longer read every user of the project. -
@zitadel/server: #2339b31e6f5- The server now measures its authentication and audit paths: how long validating a bearer credential takes and whether it was valid, revoked, invalid or failed; how often token records are checked and found active or revoked; how long verifying a password takes and whether it matched, matched and was rehashed, or did not match, for sign-ins and for the comparisons against remembered passwords on a password change; the outcome of every authentication proof by...
Zitadel NextGen v0.2.0
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: c5557cdbed6d
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:0.2.0 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
0.2.0 |
@zitadel/server |
0.2.0 |
@zitadel/server-linux-x64 |
0.2.0 |
@zitadel/server-linux-arm64 |
0.2.0 |
@zitadel/server-darwin-x64 |
0.2.0 |
@zitadel/server-darwin-arm64 |
0.2.0 |
@zitadel/server-win32-x64 |
0.2.0 |
@zitadel/api |
0.2.0 |
@zitadel/config |
0.2.0 |
@zitadel/components |
0.2.0 |
@zitadel/sdk-core |
0.2.0 |
@zitadel/sdk-next |
0.2.0 |
@zitadel/sdk-nuxt |
0.2.0 |
@zitadel/sdk-react |
0.2.0 |
@zitadel/sdk-vue |
0.2.0 |
@zitadel/sdk-angular |
0.2.0 |
@zitadel/sdk-solid |
0.2.0 |
@zitadel/sdk-svelte |
0.2.0 |
@zitadel/sdk-qwik |
0.2.0 |
@zitadel/sdk-sveltekit |
0.2.0 |
@zitadel/sdk-solid-start |
0.2.0 |
@zitadel/sdk-qwik-router |
0.2.0 |
@zitadel/sdk-tanstack-start |
0.2.0 |
@zitadel/testing |
0.2.0 |
Package Changes
Minor Changes
-
@zitadel/cli: #22926392fe2- The CLI's usage analytics events now carrysurface: cli, which names the Zitadel component that sent them, so they can be read beside the events of other Zitadel components. Nothing else they carry changes. -
@zitadel/cli: #2402a7f9216-zitadel claim --no-waitprints the claim link and exits, withclaim_url,challenge_idandexpires_atunder--json, so a script or coding agent can hand the link to a person;zitadel claim --challenge-id <id>then waits for that link to be used and records the claim. -
@zitadel/cli: #234889bcfca- Runningzitadelalone now lists the commands under six headings named for what you are doing, one row per family such asusersorrelease.zitadel users --helplists its operations, every command's help ends by pointing at the overview, andzitadel commandsstill prints the flat list. -
@zitadel/cli: #2367e7b7d61-zitadel auth-method sso enable --provider customnow asks at a terminal for the connection's name, its sign-in button's name, the issuer URL and the scopes you leave out, instead of failing with a list of flags; scripts still need the flags (docs). A new custom connection also prints its claim mappings and the file to edit them in. -
@zitadel/cli: #23235f49e7d- The CLI's onboarding output now says what to do next:zitadel startpoints tozitadel setupinstead of a console link,setupspells out every choice and shows the sign-in configuration before writing it, andauth-method sso enablesays todeploythe provider, then test sign-in. The note about Zitadel's agent skills shows once per machine.Breaking:
zitadel start --jsonno longer hasdata.console, and itsnext_actionsandnext_commandsno longer mention the console; a script that reads them gets nothing there. Runzitadel console --jsonfordata.sign_in_url. -
@zitadel/cli,@zitadel/server,@zitadel/api: #16502d78353-zitadel origin add <pattern> --kind primary|preview,origin listandorigin rmmanage the origins a project serves, with the project secret (docs). A primary origin is an exact URL, and a preview wildcard on a shared host needs a literal label of your own. -
@zitadel/cli,@zitadel/config: #227008a369b-zitadel deploynow carries operation policies from.zitadel/policies/, one file per operation, checked against the new.zitadel/meta/policy.jsonschema before anything is sent;zitadel policies listandpolicies getread them back (docs). Sign-ins and sign-ups use the policy the deployed release carries, so deploying without a file switches that policy off. -
@zitadel/cli: #16523494326- Preview a branch's release on its pull-request URLs withzitadel preview. Run inside a preview build, it reads the preview URLs from the hosting platform (Vercel or Netlify; pass Cloudflare Pages URLs with--origin) or from--origin, builds the same releasedeploydoes, validates it without touching your live sign-in providers, and makes it live on those URLs for a time-to-live (--ttl, between 60s and 365d; omitted, the project's default applies). Its last line isNEXT_PUBLIC_ZITADEL_RELEASE=sha256:...for the build to pin. Outside a preview or development build it does nothing — even with an explicit--origin— because production is deployed byzitadel deployafter merge, and--origin primaryor a primary origin's own URL is refused. On a CI platform other than Vercel or Netlify, setZITADEL_ENV=previewin the pull-request build: a CI build that names no environment is skipped too.zitadel preview listshows the project's live previews, andzitadel preview rm <url>ends one early. All three authenticate withZITADEL_PROJECT_SECRETfor now, because the server does not accept the narrower preview token yet (#1575); they never fall back to the other credential.preview listandpreview rmfail, naming the variable, when it is not set;zitadel previewinstead warns and still exits successfully unless--strictis passed. -
@zitadel/cli: #14075ab100f-zitadel pullrebuilds.zitadel/from what a release pins — the live release by default, a release id (rel_…) or a deployment id (dep_…) — so the nextdeploybuilds the same release (docs). It restores schemas and flow definitions, and warns for branding and identity provider connections, which it cannot read back yet. -
@zitadel/cli: #230744029c8-zitadel startno longer reports a login URL, because the server no longer serves a login page: sign in through the login pagezitadel setupadds to your app.Breaking:
zitadel start --jsonno longer hasdata.urls.login; a script that reads it gets nothing there. -
@zitadel/cli: #22530529137- The CLI now sends its anonymous usage events to Vercel Web Analytics on the Zitadel cloud (preview.zitadel.com), with at most eight of their properties, and sends nothing to Mixpanel for now. The existing opt-outs (--no-telemetry,DO_NOT_TRACK=1,ZITADEL_TELEMETRY=0) turn them off, and runs in CI send nothing. -
@zitadel/cli: #2245ad626b9-zitadel logsnow shows the local server's warnings in yellow and errors in red, and--level warnshows only those, so the reason a sign-in failed is easy to find.zitadel startandzitadel doctorsay to keepzitadel logs --followopen, andzitadel logsworks from an app inside the directoryzitadel startran in. -
@zitadel/cli,@zitadel/server,@zitadel/api: #1651c21caeb-zitadel deployreplacesplanandapply: it builds.zitadel/, identity provider connections included, into one immutable release, shows its git diff against the live one, and makes it live on the project's primary origins (guide). Newreleaseanddeploymentcommands, and their@zitadel/apioperations, create, list, deploy, roll back and revoke releases directly; a rollback lists the revisions it restores.Breaking:
planandapplyare removed. Usedeploy --dry-runwhere you ranplan, anddeploywhere you ranapply. The generatedreleases listandreleases getare nowrelease listandrelease get, besiderelease createandrelease revoke. Add the origins your project serves withorigin addbefore the first deploy —deployneeds at least one p...
Zitadel NextGen v0.1.0
0.1.0 is the first proper release of Zitadel NextGen, and the first on npm's latest tag. Registration and login live in your app, under your brand, while Zitadel guards the credentials, sessions and tokens underneath. An empty folder becomes an app with a working login in three commands, with no account and no Docker:
npx @zitadel/cli@latest start
npx @zitadel/cli@latest setup --framework next --server local
npm run devThis release sums up everything the alpha previews built; those versions are deprecated now. NextGen is still a preview: until 1.0.0, a minor release can include breaking changes, and each one is called out as breaking. The quickstart walks you through it.
What you get
- Sign-in and sign-up in your app.
<zitadel-login>runs the whole flow in one element: email and password, passkeys, and social sign-in with Google or any OIDC provider, where the first sign-in creates the account.<zitadel-session>and<zitadel-logout>show who is signed in and sign them out. For a UI of your own, the flow and auth-attempt APIs drive sign-in headless. Components - 12 frameworks.
zitadel setupcreates a new app or patches an existing one with login, registration and profile pages, for Next.js, Nuxt, SvelteKit, SolidStart, Qwik Router, TanStack Start, React, Vue, Angular, Solid, Svelte and Qwik. The server SDKs keep auth on your own origin: they check sessions, protect routes and keep the project secret on the server. SDKs - Users shaped by your schema. A user schema in JSON Schema says which attributes your users have, which one they sign in with, which must be unique and which sign-in methods they may use. Every write is checked against it. Flows and schemas
- Auth as code. Schemas, login flows, branding and sign-in connections are files in your repository.
zitadel planchecks them against the server's rules before anything changes, andzitadel applypublishes them as immutable revisions. Plan and apply - Your brand, your words. Theme the login with
--zl-*tokens and light and dark branding, or take over its markup withzitadel branding eject. Override any text per language; English, German and Italian are built in. Design, copy - A console. At
/ui/console/, manage users through forms built from your schema, as well as teams and project admins, and look through your schemas, flows, sign-in methods and branding, with a live preview of the login. - Create first, claim later.
zitadel setup --server https://preview.zitadel.comcreates a hosted project without an account, andzitadel claimattaches it to your team within 14 days. Projects and teams - Runs anywhere.
zitadel startruns the server from npm on your machine, with no Docker, Go or checkout, and signs you in to the console with a one-time link. To host it, take the binary for macOS, Linux or Windows or the imageghcr.io/zitadel/nextgen, with SQLite by default and PostgreSQL or Spanner in production. Local runtime, databases - Audit events. Sign-ins, sessions, users and configuration changes are recorded as typed events you can query through the API, and a self-hosted server can export them to a webhook. Events
- One API for all of it. Every operation is in the API reference, with stable error codes.
zitadel apicalls any of them from the terminal, and@zitadel/apiis a typed client with an error type per operation. API client - Built for agents. Every CLI command answers
--jsonwith one envelope.npx skills add zitadel/nextgen --full-depthinstalls Agent Skills for the CLI, the components and each SDK, and the docs come asllms.txtand over MCP. Agents - Tests against a real server.
@zitadel/testingstarts a local Zitadel for Playwright, with seeded users, signed-in pages and virtual passkeys.
Not there yet
- Password recovery, email or SMS codes, TOTP, email verification and enforced MFA. The default flow covers sign-in and sign-up with passwords, passkeys and social sign-in.
- Social sign-in is OIDC only, and a provider can't be linked to an existing account yet.
- Zitadel doesn't issue OIDC or OAuth tokens to your apps in this preview: apps use its sessions through the SDKs, and the SPA frameworks need a proxy of your own in production.
- Deploying a release to your own domains goes through the API; deploying to preview URLs, rollback and a CLI command for it are still to come.
Upgrading from 1.0.0-alpha.N
- Install with
@latest, for the CLI and every SDK;@alphanow points at0.1.0and stays there. npm sorts0.1.0below1.0.0-alpha.28, so Renovate and Dependabot won't offer this update: set the@zitadel/*versions in yourpackage.jsonto0.1.0yourself. The GitHub releasesv1.0.0-alpha.20to.28are nowv0.1.0-alpha.20to.28. - Security: an auth attempt could issue a session after verifying only the user's identifier (#2211). Upgrade the server, then revoke active sessions whose only factor is
identifier. Step-up sign-in now needs the session'ssession_tokenas well as itssession_id(#2166). - Breaking: a deploy that names a primary origin answers
400withdep.invalid; deploy withtargets: ["primary"](#1736). Also check the new error codes for schema failures (req.invalid, #1894) and over-long passwords (user.password_policy_violation, #2107), and howPOST /flowpicks the release byOrigin(#2043).
The changes listed below are the ones since 1.0.0-alpha.28, the last alpha.
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: c621117bceb2
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:0.1.0 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
0.1.0 |
@zitadel/server |
0.1.0 |
@zitadel/server-linux-x64 |
0.1.0 |
@zitadel/server-linux-arm64 |
0.1.0 |
@zitadel/server-darwin-x64 |
0.1.0 |
@zitadel/server-darwin-arm64 |
0.1.0 |
@zitadel/server-win32-x64 |
0.1.0 |
@zitadel/api |
0.1.0 |
@zitadel/config |
0.1.0 |
@zitadel/components |
0.1.0 |
@zitadel/sdk-core |
0.1.0 |
@zitadel/sdk-next |
0.1.0 |
@zitadel/sdk-nuxt |
0.1.0 |
@zitadel/sdk-react |
0.1.0 |
@zitadel/sdk-vue |
0.1.0 |
@zitadel/sdk-angular |
0.1.0 |
@zitadel/sdk-solid |
0.1.0 |
@zitadel/sdk-svelte |
0.1.0 |
@zitadel/sdk-qwik |
0.1.0 |
@zitadel/sdk-sveltekit |
0.1.0 |
@zitadel/sdk-solid-start |
0.1.0 |
@zitadel/sdk-qwik-router |
0.1.0 |
@zitadel/sdk-tanstack-start |
0.1.0 |
@zitadel/testing |
0.1.0 |
Package Changes
@zitadel/cli
Minor Changes
-
#2187
114c32cThanks @fforootd! - Addzitadel api, which calls any operation of the Zitadel API with your project's server and secret, including the ones no command covers yet. Name an operation by itsoperationId(zitadel api queryUsers) or its path (zitadel api /users/query), set query parameters and body fields with-F name=value, typed by the operation's schema, pass a whole body with--input, follow every page with--paginate, and preview the request as cURL with--dry-run.zitadel api lslists the operations, and--jsonreturns the response body asdata.@zitadel/apiexports the operations as data from@zitadel/api/generated/operations: each one's method, path, parameters, authentication and paging. -
#2215
ab19e1eThanks @fforootd! - Releases now publish to npm'slatesttag as0.xpreview versions, starting at0.1.0, instead of1.0.0-alpha.Nunderalpha: run the CLI asnpx @zitadel/cli@latestand install the SDKs with@latest. The1.0.0-alpha.Nversions are deprecated on npm. Until 1.0.0, a breaking change ships in a minor version, and its release note marks it Breaking:.zitadel setuppins the@zitadel/*packages it adds, and the commands it suggests, to the CLI's exact version on every release, andzitadel start --runtime dockerruns the server image of that version.
Patch Changes
Zitadel NextGen v0.1.0-alpha.28
Published to npm and ghcr.io as 1.0.0-alpha.28.
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: 5983d4b581e6
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:1.0.0-alpha.28 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
1.0.0-alpha.28 |
@zitadel/server |
1.0.0-alpha.28 |
@zitadel/server-linux-x64 |
1.0.0-alpha.28 |
@zitadel/server-linux-arm64 |
1.0.0-alpha.28 |
@zitadel/server-darwin-x64 |
1.0.0-alpha.28 |
@zitadel/server-darwin-arm64 |
1.0.0-alpha.28 |
@zitadel/server-win32-x64 |
1.0.0-alpha.28 |
@zitadel/api |
1.0.0-alpha.28 |
@zitadel/config |
1.0.0-alpha.28 |
@zitadel/components |
1.0.0-alpha.28 |
@zitadel/sdk-core |
1.0.0-alpha.28 |
@zitadel/sdk-next |
1.0.0-alpha.28 |
@zitadel/sdk-nuxt |
1.0.0-alpha.28 |
@zitadel/sdk-react |
1.0.0-alpha.28 |
@zitadel/sdk-vue |
1.0.0-alpha.28 |
@zitadel/sdk-angular |
1.0.0-alpha.28 |
@zitadel/sdk-solid |
1.0.0-alpha.28 |
@zitadel/sdk-svelte |
1.0.0-alpha.28 |
@zitadel/sdk-qwik |
1.0.0-alpha.28 |
@zitadel/sdk-sveltekit |
1.0.0-alpha.28 |
@zitadel/sdk-solid-start |
1.0.0-alpha.28 |
@zitadel/sdk-qwik-router |
1.0.0-alpha.28 |
@zitadel/sdk-tanstack-start |
1.0.0-alpha.28 |
@zitadel/testing |
1.0.0-alpha.28 |
Package Changes
@zitadel/cli
Minor Changes
-
#2157
adf6453Thanks @fforootd! -zitadel setup --dev-port <port>now moves an app that's already set up to another port instead of skipping it. It allows the new origin on the server, then updates the dev script or dev-server config,ZITADEL_ISSUERin.env.localandzitadel.jsontogether, so an app whose port is taken (EADDRINUSE) signs in on the new port after one command. The README and AGENTS.md sections setup writes name this command. -
#2071
fa301b9Thanks @fforootd! - The dev proxieszitadel setupwrites for React, Vue, Angular, Solid, Svelte
and Qwik apps now keep the app's session in a cookie named after its project,
__nextgen_session_<project id>, as the server SDKs do. Onlocalhost, signing
in to such an app no longer signs you out of the Console ofzitadel start, and
signing in to the Console no longer signs you out of the app. The project comes
fromZITADEL_PROJECT_IDin.env.local; without it the proxy passes cookies
through as before.For an app set up with an earlier CLI, run
zitadel doctor --fix: it adds this
to the dev proxy the CLI wrote, andzitadel doctorwarns until then. (Running
zitadel setupagain leaves an app that is already set up alone.) A dev proxy
changed by hand since is left as it is, andzitadel doctorsays the hooks must
be added by hand. A dev session from before the change is not carried over, so
sign in to the app once more.
Patch Changes
-
#2056
d04f94bThanks @fforootd! - Built-in schemas are now named underhttps://zitadel.com/schemas/v1, for examplehttps://zitadel.com/schemas/v1/user-schema.json, instead ofhttps://nextgen.com/api/schemas, a domain Zitadel does not own. The base is an identifier, not an address: the server never fetches a URL in either namespace. Existing projects need no change: a built-in schema's id resolves under either base everywhere the API reads one, includingGET /schemas/{id}, a flow definition'suser_schema, a release's schema pointer, the users list'sschemafilter, and bootstrap user documents. A server still configured with the previous base accepts the new ids too. Projects created byzitadel setupfrom now on reference the new URLs, so pair this CLI with a server from this release or later. -
#2056
d04f94bThanks @fforootd! -zitadel setupwithout--server, and the setup wizard's Zitadel Cloud choice, now target the hosted preview athttps://preview.zitadel.cominstead ofhttps://api.zitadel.cloud. A project whosezitadel.jsonnames a server keeps using that server. -
#2144
122864aThanks @fforootd! - A serverzitadel startruns can now sign users in through an identity provider on this machine, such as a test provider onhttp://localhost:9400.startpassesNEXTGEN_HTTPCLIENT_ALLOW_LIST=localhost,127.0.0.0/8,::1/128to the server unless.env.local,.envor the shell sets it; set it empty to turn it off.auth-method sso enableno longer warns about a localhost issuer on such a server, and on a--runtime dockerserver it warns that the container cannot reach this machine's localhost. -
#2153
21ac783Thanks @fforootd! -zitadel planshows an edit inside a list as the lines that changed. A flow's
steps and a step's actions are matched byname, so adding a field to one step
prints that one line under the step, with the untouched steps summarized as
hidden, instead of the wholestepslist removed and added again. Lists of
values such asfieldsmark the items added or removed.zitadel applyandzitadel setupno longer rewrite your.zitadel/files
with what the server stored: after applying a connection,.zitadel/idps/*.json
no longer gainspkce_enabled,token_endpoint_auth_methodand
id_token_mapping. A field you leave out reads as the server's default, so
planreports no change after anapply. The one fileapplystill rewrites,
and lists infiles_updated, is a flow whoseuser_schemapins a schema
revision id the apply superseded. -
#2145
4d63c44Thanks @fforootd! - A Next.js app created byzitadel setup --framework nextno longer logsCould not validate \instant`errors innext devon every request to/. The home page setup writes still redirects to/login, and now opts out of Next.js's instant-navigation check, which Cache Components (on by default in new Next.js apps) runs on every page. The@zitadel/sdk-nextREADME'sauth()examples now render the component that callsauth()insideand import it from@zitadel/sdk-next/server`, so they build with Cache Components on. -
#2148
3d80fcbThanks @fforootd! - The/login,/registerand/profilepages thatzitadel setupwrites for a new Next.js app paint the sign-in page's dark background on the first paint, so they no longer show a white page before the sign-in form loads. -
#2151
b53ef49Thanks @fforootd! - Editors no longer flagzitadel.jsonfor an unreachable schema.zitadel setupnow writes the schema ofzitadel.jsonto.zitadel/meta/project.json, next to the flow and user-schema dialects, and points the file's$schemaat it, so editors validate the project configuration offline instead of trying to loadhttps://schemas.zitadel.com/v2/project.schema.json, which never existed. In a project set up earlier, delete the$schemaline fromzitadel.jsonto silence the warning; only editors read it. -
#2077
7c3d3dcThanks @fforootd! - The Qwik meta-framework SDK is@zitadel/sdk-qwik-router, named after Qwik Router, which Qwik 2 renamed from Qwik City; it was never published as@zitadel/sdk-qwik-city. The CLI calls the frameworkqwik-routertoo (zitadel setup --framework qwik-router), and its docs page moved to/docs/sdks/qwik-router. -
#2076
12b3226Thanks @fforootd! - The server SDKs now count a session as signed in only when it belongs to the
app's own project. A session of another project on the same server, such as a
second app on the same host or the console of a localzitadel start, reads
as signed out inprotectedRoutes,auth()andgetAuth(), and its cookie is
left in place for the app it belongs to.The project comes from the new
projectIdmiddleware option, else
ZITADEL_PROJECT_ID, else the framework's public project id variable
(NEXT_PUBLIC_,...
Zitadel NextGen v0.1.0-alpha.25
Published to npm and ghcr.io as 1.0.0-alpha.25.
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: 3fa9a3bdff9e
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:1.0.0-alpha.25 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
1.0.0-alpha.25 |
@zitadel/server |
1.0.0-alpha.25 |
@zitadel/server-linux-x64 |
1.0.0-alpha.25 |
@zitadel/server-linux-arm64 |
1.0.0-alpha.25 |
@zitadel/server-darwin-x64 |
1.0.0-alpha.25 |
@zitadel/server-darwin-arm64 |
1.0.0-alpha.25 |
@zitadel/server-win32-x64 |
1.0.0-alpha.25 |
@zitadel/api |
1.0.0-alpha.25 |
@zitadel/config |
1.0.0-alpha.25 |
@zitadel/components |
1.0.0-alpha.25 |
@zitadel/sdk-core |
1.0.0-alpha.25 |
@zitadel/sdk-next |
1.0.0-alpha.25 |
@zitadel/sdk-nuxt |
1.0.0-alpha.25 |
@zitadel/sdk-react |
1.0.0-alpha.25 |
@zitadel/sdk-vue |
1.0.0-alpha.25 |
@zitadel/sdk-angular |
1.0.0-alpha.25 |
@zitadel/sdk-solid |
1.0.0-alpha.25 |
@zitadel/sdk-svelte |
1.0.0-alpha.25 |
@zitadel/sdk-qwik |
1.0.0-alpha.25 |
@zitadel/testing |
1.0.0-alpha.25 |
Package Changes
@zitadel/cli
Minor Changes
-
#1406
46a366fThanks @mridang! - Distribute the CLI's agent guidance as an installable Agent Skill. Any skills-compatible coding agent — Claude Code, Cursor, Copilot, Codex, and more — can now add it withnpx skills add zitadel/nextgen --full-depth, giving the agent guided, always-current instructions for scaffolding and managing Zitadel auth with thezitadelCLI. The skill also ships inside the@zitadel/clipackage. -
#1366
025acc6Thanks @mridang! -zitadel setupno longer limits onboarding to one social provider. The onboarding question is a multi-select rather than one choice, and declining is an empty selection rather than a "not now" option beside the providers. Each chosen provider is asked for its own client id and secret, gets its own connection file, and has its slug added to the schema and the login flow — which already carriedsso_providersas a list. The summary and the--jsonpayload report one entry per provider, so a publish that did not land names the provider it belongs to.--ssostill takes a single provider: a scripted run pipes one secret on stdin, andsso enableadds the rest. The catalog ships one provider today, so this changes what the CLI supports rather than what a developer can pick right now — a second catalog entry is what makes the multi-select visible. -
#1281
79527edThanks @mridang! - Add social sign-in to the CLI.zitadel sso enable --provider googleconfigures an identity provider on an existing Project: it says what to register with the vendor and at which redirect URI, takes the client id and secret, writes.zitadel/idps/<slug>.json, enablesssoon the user schema, and adds the provider button plus the steps and routes a provider round trip needs to every login flow that runs against that schema. The client secret is never a flag — it is prompted for, or piped in on stdin for a scripted run — and never written to disk: only its${{ NAME }}reference reaches the connection file, and the value is published to the Project as an encrypted variable, which is where the engine resolves it from.zitadel setupasks the same question during onboarding, so a Project can start with Google rather than adding it afterwards, with--ssoand--sso-client-idfor scripted runs. Everything so far is local: publishing the connection needs identity provider support on the server, which is not in this release, soapplycannot upload a connection file yet and deleting one is not supported either. Enable the provider once that support ships. -
#1358
67461efThanks @mridang! -@zitadel/sdk-qwiknow targets Qwik 2: it declares a peer dependency on@qwik.dev/core(^2.0.0-beta.45) in place of@builder.io/qwik, so your app must be on Qwik 2 to use it. Qwik 2 runs on Vite 8. The widgets stay reactive to their props, mirroring the other framework SDKs.The CLI's Qwik support follows suit.
zitadel setupnow scaffolds and detects Qwik 2 apps: a new app is created on@qwik.dev/coreand Vite 8 (no Vite 7 pin), and a Qwik 1 project is no longer auto-detected, since it cannot use the Qwik 2 SDK. -
#1406
46a366fThanks @mridang! -setupnow decides where to scaffold with a plain rule instead of a maintained allowlist. A directory with a detected framework is integrated in place; an empty directory gets a fresh app; a non-empty directory with no framework stops and asks for--force.setup --forcescaffolds a fresh app into a non-empty directory, moving the existing files aside and restoring everything the scaffold does not create. This removes the treadmill of allowlisting each tool's metadata (.gitignore,.zitadel,.claude, …) and lets you install the agent skill into a project directory and then scaffold there with an explicit--force. -
#1371
0269f56Thanks @IAM-marco! -zitadel setupandzitadel sso enablewrite the renamed SSO outcomes into the login flow:sso_authenticatedandsso_user_not_found.user_already_existskeeps its name and is shared with the typed collision. On a flow an earlier version wrote,zitadel sso enablerenamescallbackandidentity_unknownto the new keys, so enabling another provider keeps the flow valid. If one of those old keys declarespurposeoraction, which the new keys refuse, the command stops with a validation error naming the step and the key, so you can remove them first. If a step the command edits already has an action named like an outcome it writes there (sso_authenticated,sso_user_not_foundoruser_already_exists), whether or not the flow still uses the old keys, the command stops with a validation error naming the step and the action, so you can rename that action first.
Patch Changes
-
#1383
4c07937Thanks @mridang! - Human output can now be turned colourless with--no-color, and theNO_COLORandFORCE_COLORenvironment variables are honoured. This covers both the step logging and the highlighted commands, paths and ids, so piped and CI runs read cleanly;--colorforces colour on. -
#1456
3937a77Thanks @mridang! - A platform request that gets no response is now reported reliably and can be cancelled.@zitadel/api: the client throws a typedNetworkError(reasonunreachableortimeout) when
a request gets no response, alongsideApiErrorfor a failing status.createZitadelClient
takes an optionalsignalandtimeoutMs; an aborted request rejects with the signal's reason.@zitadel/cli: a refused, unresolvable or silent server reportsE_NETWORK(exit 4) on every
command, the same as a server answering 5xx; before, a failure worded differently by the fetch
runtime fell through toE_VALIDATION(exit 3). Each request has a 30-second deadline, and
Ctrl-C while one is waiting cancels it with the newE_CANCELLED(exit 130) instead of leaving
the command hung behind a spinner.
-
#1383
4c07937Thanks @mridang! - Every product command now accepts-vas the short form of--verbose, matching the convention agents already expect from curl, ssh, and wget. The long--verboseis unchanged, and the root--versionkeeps no short form, so nothing collides. -
#1495
8c08f48Thanks @mridang! - Show CLI warnings in both terminal and JSON output.--jsonresults fromclaim,start,sso enable,setup,planandapplynow include warnings that were only printed to the terminal before. -
#1429
7f95a7bThanks @bastionstack! - Make the local journey work when the app lives inside the directoryzitadel startran in, and say how to cont...
Zitadel NextGen v0.1.0-alpha.24
Published to npm and ghcr.io as 1.0.0-alpha.24.
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: e5074ac29917
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:1.0.0-alpha.24 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
1.0.0-alpha.24 |
@zitadel/server |
1.0.0-alpha.24 |
@zitadel/server-linux-x64 |
1.0.0-alpha.24 |
@zitadel/server-linux-arm64 |
1.0.0-alpha.24 |
@zitadel/server-darwin-x64 |
1.0.0-alpha.24 |
@zitadel/server-darwin-arm64 |
1.0.0-alpha.24 |
@zitadel/server-win32-x64 |
1.0.0-alpha.24 |
@zitadel/api |
1.0.0-alpha.24 |
@zitadel/config |
1.0.0-alpha.24 |
@zitadel/components |
1.0.0-alpha.24 |
@zitadel/sdk-core |
1.0.0-alpha.24 |
@zitadel/sdk-next |
1.0.0-alpha.24 |
@zitadel/sdk-nuxt |
1.0.0-alpha.24 |
@zitadel/sdk-react |
1.0.0-alpha.24 |
@zitadel/sdk-vue |
1.0.0-alpha.24 |
@zitadel/sdk-angular |
1.0.0-alpha.24 |
@zitadel/sdk-solid |
1.0.0-alpha.24 |
@zitadel/sdk-svelte |
1.0.0-alpha.24 |
@zitadel/sdk-qwik |
1.0.0-alpha.24 |
@zitadel/testing |
1.0.0-alpha.24 |
Package Changes
@zitadel/cli
Minor Changes
-
#1286
b633a22Thanks @mridang! - Breaking: remove--environment(-e) fromplan,applyand the resource commands (users,teams,sessions,events,grants,idps,projects,schemas,environments,releases,flow-definitions,branding). It accepted onlydevelopment,previeworproduction— none of them a name the platform uses — and never reached the platform: its one effect was to read a server URL fromenvironments.<name>.serverinzitadel.json, a key nothing writes. Passing it now fails as an unknown flag; drop it from scripts.--server,ZITADEL_API_BASEand the top-levelserverinzitadel.jsonstill choose the server, andenvironments list/environments getstill read the platform's environments.The CLI therefore has no per-environment flag at all until the platform's environments settle, which is also why the new
variablescommands address the project level only. Their own--environment/--envnever shipped. -
#1297
7165d73Thanks @peintnermax! - Setup no longer applies a login template, and the template catalog keeps
only widget structure.zitadel setupdrops the "How should the login look?" question and the
--designflag; passing--designnow fails withE_VALIDATIONand a
hint pointing at app-side theming andbranding eject. It embeds the
maintained login component (a starting page for a new app, a drop-in for an
existing one), writes nothing under.zitadel/branding/, and publishes no
branding revision. The JSON envelope
dropsdata.design, the summary drops the "Login design" row, and the next
actions point at theming the component from your app, with
branding ejectas the opt-in for owning its template.zitadel branding eject --designnow offerscentered(the default card)
andminimal(the same form without card chrome).split,split-right
andheroare removed: they were page layout around the same card, which
belongs in your application, and asking for one fails withE_VALIDATION
and a hint saying so.BRANDING_DESIGNSin@zitadel/config
shrinks accordingly.- Revisions already published from
split,split-rightorherokeep
rendering; the login still ships their chrome. The API reference for
Branding.layoutno longer lists the retired designs.
Patch Changes
-
#1296
1a05521Thanks @IAM-marco! - The CLI documentation now explains the local adminadmin@zitadel.localhost
thatzitadel startcreates by default, the one-time console sign-in link it
prints, thezitadel consolecommand that prints a fresh link, and that on the
default local runtimezitadel setupattaches the project to that admin's
team, sozitadel claimreports it as already owned. -
#1288
4bea70aThanks @mridang! - Encode path parameters in the generated API client, so any id the API accepts can be fetched. Schema ids are the case that hit today: a schema's id is its$id, usually a URL such ashttps://nextgen.com/api/schemas/default-human-user.json. Sent raw, the//collapsed on a redirect and the request 404'd, sozitadel schemas get <id>failed for every URL id and the console's user list silently dropped its schema columns.zitadel schemas getalso stops guessing what an id looks like: it used to read anything withoutsch_or://as an object type, which sent ids likeurn:example:humandown the wrong path. It now asks the server, and falls back to the object-type lookup only on a 404. Setup reconciliation andapply/planschema fetches used to encode the id themselves to work around the same bug; that is gone, so the client encodes exactly once rather than sending%25for every delimiter. -
#1292
0a82bb1Thanks @mridang! - Correct thegrantscommand reference. The README still documented--principal-typeand--principal-idongrants create, andprincipal_type/principal_idas filter fields ongrants list, which the user and team locators replaced:grants createtakes--relationas its only required field flag and names the principal through--data/--file, andgrants listfilters onuser_idandteam_id.grants create --helpalso no longer suggestsgrants create --relation viewer. A grant needs exactly one ofuserorteam, which are nested objects no flag can carry, so that run was never a complete body. Any write command whose body needs a nested object or an array now offers only its--dataand--fileexamples.
@zitadel/server
Minor Changes
-
#1319
5bac207Thanks @IAM-marco! - Add the identity provider connection endpoints:POST /idpscreates a
connection for a new slug (201) or appends a revision to the existing one
(200), with the document validated againstidp-connection.jsonbefore it
is stored and the identity fields (protocol,subject_claim, OIDC
issuer, OAuth2token_endpointanduserinfo_endpoint) fixed for the
life of the connection.GET /idps/{id},POST /idps/query(filter and
sort byslugandcreated_at),GET /idps/{id}/revisionsand
GET /idps/revisions/{revision_id}read them. Writes emitidp.created
andidp.updatedaudit events. -
#1299
d05fa4cThanks @peintnermax! - Choose the project you are working on in the console's project switcher. Teams, users, user schemas, login flows, branding and the project's own settings all follow the selected project, and the selection is part of the URL, so it survives a refresh and a shared link. With a single project the console selects it for you; with several, it opens the Projects overview so you can pick one.The sidebar lists Projects first, then the selected project's screens; the switcher's "All projects" link opens Projects too. A project's name and admins are under "Project settings" in the sidebar. Links to
/projects/{id}still work: they open that project's settings with it selected. -
#1319
5bac207Thanks @IAM-marco! - Request decode errors keep the normalizedreq.invalidmessage and now
carrydetails.fields: the dotted paths of the fields the request
validation rejected, names only, never values or decoder text. For map
fields the last path element is the client's own key. -
#1215
91b1eb6Thanks @vitorbari! - Releases can now be deployed to environments over the API.POST /deploymentsmakes a release live on an environment, atomically: when the call returns, the environment runs the named release and an immutable record of the act exists; on any failure nothing changes. Deploying, promoting and rolling back are all this call —reasonsays which, defaulting todeploy, and a promotion records the environment it came from. The record keeps ids and timestamp top-level; the why-and-who (reason, a free-formmessage, `source_environment...
Zitadel NextGen v0.1.0-alpha.23
Published to npm and ghcr.io as 1.0.0-alpha.23.
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: 221ac815478e
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:1.0.0-alpha.23 |
| container | ghcr.io/zitadel/nextgen:latest |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
1.0.0-alpha.23 |
@zitadel/server |
1.0.0-alpha.23 |
@zitadel/server-linux-x64 |
1.0.0-alpha.23 |
@zitadel/server-linux-arm64 |
1.0.0-alpha.23 |
@zitadel/server-darwin-x64 |
1.0.0-alpha.23 |
@zitadel/server-darwin-arm64 |
1.0.0-alpha.23 |
@zitadel/server-win32-x64 |
1.0.0-alpha.23 |
@zitadel/api |
1.0.0-alpha.23 |
@zitadel/config |
1.0.0-alpha.23 |
@zitadel/components |
1.0.0-alpha.23 |
@zitadel/sdk-core |
1.0.0-alpha.23 |
@zitadel/sdk-next |
1.0.0-alpha.23 |
@zitadel/sdk-nuxt |
1.0.0-alpha.23 |
@zitadel/sdk-react |
1.0.0-alpha.23 |
@zitadel/sdk-vue |
1.0.0-alpha.23 |
@zitadel/sdk-angular |
1.0.0-alpha.23 |
@zitadel/sdk-solid |
1.0.0-alpha.23 |
@zitadel/sdk-svelte |
1.0.0-alpha.23 |
@zitadel/sdk-qwik |
1.0.0-alpha.23 |
@zitadel/testing |
1.0.0-alpha.23 |
Package Changes
@zitadel/cli
Minor Changes
-
#1210
48351c4Thanks @mridang! - Add resource commands to the CLI.users,teams,sessions,events,grants, andprojectseach gain the operations their API supports — users the full set, teams the same withdeactivatein place ofdelete, sessions list, get and revoke, grants list, get, create and delete, projects list, get and update, and events list and get.idpsgainslist,getandcreate, andschemas,environments,releases,flow-definitionsandbrandinggainlistandgetonly: they are authored as files and shipped through a release, so the CLI reads them and never writes them. Every list shares one--filter field=operation:valuegrammar regardless of whether the endpoint takes a query body or query parameters, with each field declaring the operations it accepts so an unsupported one is refused locally rather than as a server error. Cursor pagination,--fieldsto choose columns, per-field flags on writes, local schema validation,--dry-run, and a--forceguard on destructive verbs are the same everywhere.schemas listandflow-definitions listshow the current revision of each rather than the full history, with--filter revisions=allfor the history, andschemas getandflow-definitions getaccept the object type or flow name as well as a revision id.zitadel resourcesreports the whole surface in one call.Breaking:
schemas listis now generated from the same registry as every other list. Its--jsonenvelope changes from{ object_type, revisions, count }to the standard{ items, count, next_page_token };--object-typebecomes an optional--filter object_type=<value>rather than a required flag; and the interactive revision picker is gone, sinceschemas get <id>reads one revision. A bareschemas liststill returns the complete revision history. -
#1224
1162dc9Thanks @mridang! - A branding descriptor now points at its login template with"liquid_template": { "$file": "./login.liquid" }instead of a separateliquid_template_filekey. The CLI replaces any$filereference with the file's content before publishing and writes the published value back into the file afterwards.branding ejectandsetup --designscaffold the new form, and a descriptor that still carriesliquid_template_filefailszitadel planwith a hint showing the replacement. -
#1187
a41c594Thanks @mridang! - The project's env files now configure the local server.zitadel startreads.env.local, then.env, and hands everyNEXTGEN_*variable to the server it launches: through the process environment on the binary backend and as bare--env NAMEon Docker. No value ever reaches the command line,.zitadel/local/runtime.json, logs, or--jsonoutput; only the names are recorded, asenv.injected, andzitadel statusreports them. The address, data directory and public base the CLI sets itself always win. A running runtime is not updated in place, so after changing a value runzitadel stopandzitadel start.setupnow writes a comment at the top of the scaffolded.env.exampleand.env.localsaying so. -
#1249
116e037Thanks @mridang! - Group the root help by purpose.zitadel,zitadel --help, andzitadel helpnow list commands under "Project commands", "Local server commands", and "Configuration commands" in journey order, with oclif's own utilities under "Additional commands", followed by flags, examples, and where to learn more, in the layout ofgh --help. Nested commands such asschemas listandbranding ejectare listed inline; theuninstallalias andhelpare not. Per-command help and--jsonoutput are unchanged. -
#1274
1feea7dThanks @mridang! - Identify the CLI in theUser-Agentof its HTTP requests — Zitadel API calls, local-server health checks and branding asset probes — so server logs and session records can tell CLI traffic and CLI versions apart. Requests used to carry Node's barenode; they now sendzitadel-cli/<version> node/<version> <os>/<release> arch/<arch>, followed byci/<provider>when running in CI andhost/<name>when running under a detected host such as Claude Code, Cursor or VS Code, e.g.zitadel-cli/1.0.0 node/v24.12.0 darwin/24.6.0 arch/arm64 host/claude_code. Theci/andhost/tokens are left out when telemetry is opted out with--no-telemetry,DO_NOT_TRACKorZITADEL_TELEMETRY=0. -
#1259
a5a9046Thanks @mridang! - Manage per-environment variables and secrets from the CLI withzitadel variables list|get|set|delete. Each command names its owner with--environment(alias--env) or--project-level, and a non-interactive run that names neither is refused rather than defaulted. -
#1224
1162dc9Thanks @mridang! - The branding and flow definition editor schemas now flag what the server rejects: asset URLs that carryuser:password@,typography.font_urlwithouttypography.font_family, a terminal step that also collects or acts, a step that does nothing,sso_providerswithout acallbacktransition, and a transition that sets bothpurposeandaction. The API client's Zod schemas reject credentials in branding asset URLs, andzitadel planmeasures asset URL length in bytes, as the server does. -
#1116
f118796Thanks @grvijayan! - Flow definitions sync as revisions. An edited flow file plans as areviseandapplypublishes a new immutable revision instead of updating in place. A schema revise re-publishes the flows pinned to it with the newuser_schemain the same run. Removing a flow file no longer deletes the flow on the platform;applyfails withE_NOT_IMPLEMENTEDinstead. -
#1156
84d1c4bThanks @grvijayan! - Social login gets its configuration contracts.zitadel setupnow copies two more dialect files into.zitadel/meta/:idp-connection.json, the schema for a provider connection file, andsso-auth-method.json, the shape of thessoslot in a user schema. A user schema withsso.enabled: truemust now list the connection slugs its users may sign in with undersso.providers, and a disabled slot must not carry the list. In a flow definition,identity_unknownis a reserved transition outcome that switches a login flow to register when a provider returns an unknown user. -
#1225
b0e0f02Thanks @mridang! -zitadel startnow boots the local server with the platform project and a local admin, so you exist on your own server without signing up, and prints a one-time link that signs you in to the console. The newzitadel consolecommand mints a fresh link whenever you need one; the console honours such a link only when it is served from loopback. A localzitadel setupattaches the new project to the admin's ...
Zitadel NextGen v0.1.0-alpha.22
Published to npm and ghcr.io as 1.0.0-alpha.22.
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: 009f19dda49e
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:1.0.0-alpha.22 |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
1.0.0-alpha.22 |
@zitadel/server |
1.0.0-alpha.22 |
@zitadel/server-linux-x64 |
1.0.0-alpha.22 |
@zitadel/server-linux-arm64 |
1.0.0-alpha.22 |
@zitadel/server-darwin-x64 |
1.0.0-alpha.22 |
@zitadel/server-darwin-arm64 |
1.0.0-alpha.22 |
@zitadel/server-win32-x64 |
1.0.0-alpha.22 |
@zitadel/api |
1.0.0-alpha.22 |
@zitadel/config |
1.0.0-alpha.22 |
@zitadel/components |
1.0.0-alpha.22 |
@zitadel/sdk-core |
1.0.0-alpha.22 |
@zitadel/sdk-next |
1.0.0-alpha.22 |
@zitadel/sdk-nuxt |
1.0.0-alpha.22 |
@zitadel/sdk-react |
1.0.0-alpha.22 |
@zitadel/sdk-vue |
1.0.0-alpha.22 |
@zitadel/sdk-angular |
1.0.0-alpha.22 |
@zitadel/sdk-solid |
1.0.0-alpha.22 |
@zitadel/sdk-svelte |
1.0.0-alpha.22 |
@zitadel/sdk-qwik |
1.0.0-alpha.22 |
@zitadel/testing |
1.0.0-alpha.22 |
Package Changes
@zitadel/cli
Minor Changes
- #1147
893364cThanks @IAM-marco! - Clearer claim journey output: commands now sit on their own styled line in the setup box, separated from the prose so they can be copied without surrounding words, the end-of-setup notice states the concrete deadline (date, time, and zone) until which the temporary project can be claimed, terminal boxes wrap to the window width instead of breaking their frame below 80 columns, andzitadel claimexplains a closed 14-day claim window instead of suggesting a futile retry.zitadel setupnow also nudges against a local server when that server hosts the platform plane (probed via its runtime document), where the claim can actually complete; the offline surfaces (status,doctor) keep their cloud-only nudges.
@zitadel/server
Minor Changes
-
#1169
c7c737aThanks @bastionstack! - Land the claim page on sign-up with a claim-window countdown, drop passkeys from the shipped default login flow, and fix three sign-in surface defects found in design QA.A developer opening a claim link from
zitadel claimnormally has no account on the deployment yet, so the claim page now enters the flow withpurpose="register"; the register step's ownsign_inaction carries the returning developer back. Beside every state of that page it shows how long the project can still be claimed, read from the new unauthenticatedGET /projects/{project_id}/claim/window?challenge_id=..., so an expired claim link no longer reads as an expired project. The sign-in widget grows anattribution-trailingslot for it: the design has always drawn a badge beside the "Secured with Zitadel" trustmark, and the widget could not fill it because nothing on a flow response carries a duration — a host that has one can now put it there, and an embed that ignores the slot renders exactly as before.The shipped
password-firstlogin flow no longer offerspasskeyonidentifier/passwordorpasskey_registeronregister— the passkey legs proved unreliable in testing, and thepasskey-firstpreset remains the way to offer them.Three fixes to the sign-in surface itself: the alert's error icon keeps its 16px size and centres on the first line of text instead of shrinking under a long message and floating above a short one; a terminal step that is about to navigate no longer paints a "you are signed in" screen the host immediately replaces, so one sign-in produces one confirmation; and the sign-up card gains the subtitle every other step already had.
-
#1093
82186ceThanks @grvijayan! - Flow definitions are revisioned:POST /flow_definitionspublishes a new
revision on every call, so a repeatednameno longer returns 409, and
GET /flow_definitionsaccepts anamefilter that lists one flow's
revisions newest first. -
#1118
c3fbdeeThanks @adlerhurst! - Add POST /grants/query to list a project's collaboration grants, with always-on user-ref or team-ref labels and an opt-inexpand: ["principal"]that embeds the GET user or GET team body. -
#1155
af21963Thanks @vitorbari! - The events API defines therelease.createdevent type and its payload.The payload carries the release's
content_hash, its audit metadata (message,git_sha,git_dirty) and the(kind, handle, revision_id)tuples the release pins, so an audit stream answers what a release changed without reading the releases table. Nothing emits the event untilPOST /releasesis implemented. -
#1115
472a182Thanks @vitorbari! - Adds persistence support for releases — immutable, project-scoped configuration snapshots that pin one revision of each resource they include.Release records store their pinned revisions and assembly metadata. A project-scoped content-hash index prevents duplicate snapshots and provides the storage contract needed for idempotent release orchestration in a follow-up.
-
#1146
e04e3ceThanks @IAM-marco! - Unclaimed projects can now only be claimed within 14 days of creation. After that, claim init and complete return 410proj.claim_window_expired(distinct from the retryableproj.claim_expiredchallenge error), and claim status reports the same final 410 for a pending challenge, taking precedence over challenge expiry so polling clients stop suggesting a futile retry. The claim grant is the status route's source of truth: a project claimed through another concurrent challenge reportscompletedwith its owning team, never a false expiry verdict. Nothing is deleted when the window closes.Separately, default-project resolution (the console runtime document and the bare hosted login) now skips the built-in platform project in its first-created heuristic: a deployment that once ran with
platform.bootstrap_projectand later disabled it resolves its first real project instead of the leftover platform row. Explicitplatform.project_idconfiguration is unchanged.
Patch Changes
-
#1134
c0bef04Thanks @muhlemmer! - createProject response now includes the project name field. -
#1150
fce5a75Thanks @vitorbari! - Fix three sign-in dead ends. Choosing "sign in with a passkey" on a password
step no longer treats the password box the browser posts alongside it as a
submission, so the WebAuthn prompt appears instead of a required-field or
invalid-credentials error. Going back to the identifier step now releases the
user resolved by the abandoned attempt, so re-entering an address signs in
normally instead of failing with "The user was already authenticated". And
signing up with an address that already has an account now completes: that
sign-in reached the final step without a handoff token, leaving the user
unable to exchange it for a session. -
#1136
1f5e7b9Thanks @muhlemmer! - Flow submit endpoint now rejects requests with unrecognized top-level properties instead of silently ignoring them. -
#1135
4a637a3Thanks @muhlemmer! - instrumentation.log.level, instrumentation.log.format, and instrumentation.log.streams now accept string names (e.g. debug, json, request) in addition to numeric values.
@zitadel/api
Minor Changes
- #1093
82186ceThanks @grvijayan! - Flow definitions are revisioned:POST /flow_definitionspublishes a new
revision on every call, so a repeatednameno longer returns 409, and
GET /flow_definitionsaccepts anamefilter that lists one flow's
revisions newest first.
...
Zitadel NextGen v0.1.0-alpha.21
Published to npm and ghcr.io as 1.0.0-alpha.21.
Generated Release Facts
This section is maintained by release automation. Edit product notes outside this block.
Release commit: fa28cb9632df
Container Images
| Image | Reference |
|---|---|
| container | ghcr.io/zitadel/nextgen:1.0.0-alpha.21 |
npm Packages
| Package | Version |
|---|---|
@zitadel/cli |
1.0.0-alpha.21 |
@zitadel/server |
1.0.0-alpha.21 |
@zitadel/server-linux-x64 |
1.0.0-alpha.21 |
@zitadel/server-linux-arm64 |
1.0.0-alpha.21 |
@zitadel/server-darwin-x64 |
1.0.0-alpha.21 |
@zitadel/server-darwin-arm64 |
1.0.0-alpha.21 |
@zitadel/server-win32-x64 |
1.0.0-alpha.21 |
@zitadel/api |
1.0.0-alpha.21 |
@zitadel/config |
1.0.0-alpha.21 |
@zitadel/components |
1.0.0-alpha.21 |
@zitadel/sdk-core |
1.0.0-alpha.21 |
@zitadel/sdk-next |
1.0.0-alpha.21 |
@zitadel/sdk-nuxt |
1.0.0-alpha.21 |
@zitadel/sdk-react |
1.0.0-alpha.21 |
@zitadel/sdk-vue |
1.0.0-alpha.21 |
@zitadel/sdk-angular |
1.0.0-alpha.21 |
@zitadel/sdk-solid |
1.0.0-alpha.21 |
@zitadel/sdk-svelte |
1.0.0-alpha.21 |
@zitadel/sdk-qwik |
1.0.0-alpha.21 |
@zitadel/testing |
1.0.0-alpha.21 |
Package Changes
@zitadel/cli
Patch Changes
-
#1127
a24ec4dThanks @IAM-marco! -zitadel claimagainst a CLI-launched local server (--server local) now opens the claim page on the local server itself instead of a remote default: the CLI passes the server's public base when it starts the binary or docker runtime. When a manually started loopback server still advertises a remote claim page,claimwarns and names theNEXTGEN_SERVER_PUBLIC_BASEsetting to fix it. -
#1085
a59b288Thanks @livio-a! - Session responses identify their user through a resolved user ref derived
from the user schema's ownx-identifier/x-displaydesignations (ADR 058),
replacing the convention-resolved flatname/emailfields this supersedes
(see the earlierGET /sessions/meidentity changeset). Rendering follows one
chain everywhere:display, falling back toidentifier, thenuser_id.@zitadel/server:GET /sessions/me, session get, and query sessions embed
user({user_id, identifier, identifier_property, display}), the list
path hydrated with one batch resolution per page — listed sessions now carry
user identity at all. The conventional attribute-name resolver
(name/givenName+familyName/email) is removed.@zitadel/api: the regenerated client types the newuserref component.@zitadel/components:<zitadel-session>/<zitadel-logout>render from
the ref; thezitadel-signoutdetail is now{display, identifier};
logout templates substitute{{display}}/{{identifier}}(the old
{{name}}/{{email}}tokens keep filling as aliases).@zitadel/sdk-core(and every SPA SDK via the shared contract):
NextgenSession/ClientSessionbecome{userId, identifier, identifierProperty, display}; JWT-claim identities mapname→display
andemail→identifier.@zitadel/sdk-next/@zitadel/sdk-nuxt: server and client session reads
return the new shape.@zitadel/cli: scaffolded Nuxt auth plugins emit the new fields.
Breaking: the flat
name/emailsession fields and the old SDK session
shape are gone. An unknown property is dropped rather than rejected, so a
client left on the old fields reads silently empty values instead of failing
loudly — update server, SDKs, and app chrome together.
@zitadel/server
Minor Changes
-
#1124
6b59d5aThanks @bastionstack! - Show each user's teams in the console users list. The memberships ride along on
POST /users/querywithexpand: ["teams"], so the column costs no request per
row, and a user on more teams than the embedded list carries says so rather than
presenting the cap as the whole roster. A credential that may not read
memberships keeps the list and loses the column. -
#1085
a59b288Thanks @livio-a! - Session responses identify their user through a resolved user ref derived
from the user schema's ownx-identifier/x-displaydesignations (ADR 058),
replacing the convention-resolved flatname/emailfields this supersedes
(see the earlierGET /sessions/meidentity changeset). Rendering follows one
chain everywhere:display, falling back toidentifier, thenuser_id.@zitadel/server:GET /sessions/me, session get, and query sessions embed
user({user_id, identifier, identifier_property, display}), the list
path hydrated with one batch resolution per page — listed sessions now carry
user identity at all. The conventional attribute-name resolver
(name/givenName+familyName/email) is removed.@zitadel/api: the regenerated client types the newuserref component.@zitadel/components:<zitadel-session>/<zitadel-logout>render from
the ref; thezitadel-signoutdetail is now{display, identifier};
logout templates substitute{{display}}/{{identifier}}(the old
{{name}}/{{email}}tokens keep filling as aliases).@zitadel/sdk-core(and every SPA SDK via the shared contract):
NextgenSession/ClientSessionbecome{userId, identifier, identifierProperty, display}; JWT-claim identities mapname→display
andemail→identifier.@zitadel/sdk-next/@zitadel/sdk-nuxt: server and client session reads
return the new shape.@zitadel/cli: scaffolded Nuxt auth plugins emit the new fields.
Breaking: the flat
name/emailsession fields and the old SDK session
shape are gone. An unknown property is dropped rather than rejected, so a
client left on the old fields reads silently empty values instead of failing
loudly — update server, SDKs, and app chrome together. -
#1092
7a06425Thanks @livio-a! - User responses carry the derived identity of ADR 058 §3a: the envelope
gains read-onlyidentifier,identifier_property, anddisplay,
resolved live from each user's own schema designations
(x-identifier/x-display) on every read path — query users (one batch
resolution per page), get by id,users/me, and the create read-back.
Clients renderdisplay, falling back toidentifier, thenid, with
zero designation logic of their own. The embedded console (shipped inside
@zitadel/server) renders them: the users list gains a leading User
identity column on exactly that chain plus a dedicated role-named
Identifier column (platform-derived, outside the schema-driven column
set), the user detail heads with the identity, and the console's
convention-based display-name guesser is removed.
Patch Changes
-
#1126
21beee0Thanks @IAM-marco! - The server now mints claim and dashboard URLs from a dedicatedserver.public_basesetting (envNEXTGEN_SERVER_PUBLIC_BASE, defaulthttps://nextgen.zitadel.cloud) instead of deriving them from the schema identity namespace. Deployments reachable at another origin — a local server most of all — set the new key andzitadel claimopens the right console instead of a deadnextgen.comaddress. A misconfigured base (query, fragment, userinfo, or a non-http(s) scheme) now fails at startup instead of leaking into every minted URL. -
#1090
941645eThanks @livio-a! - Internal plumbing for ADR 058 §3/§4: theuser-refresolution primitives
(designation readers,domain.ResolveUserRef, and the batched
(project_id, user_ids) → refsresolution port) and the inertuser-ref
wire component. No endpoint behavior changes yet — session adoption ships
separately.
@zitadel/api
Minor Changes
- #1085
a59b288Thanks @livio-a! - Session responses identify their user through a resolved user ref derived
from the user schema's ownx-identifier/x-displaydesignations (ADR 058),
replacing the convention-resolved flatname/emailfields this supersedes
(see the earlierGET /sessions/meidentity changeset). Rendering follows one
chain everywhere:display, falling back toidentifier, thenuser_id.@zitadel/server:GET /sessions/me, session get, and query sessions embed
user(`{user_id, identifier, identifier_property, dis...