Skip to main content
All Keycloak alternatives
Keycloak vs. Zitadel

Both are open source. The license and the extension model decide it.

Most Keycloak comparisons turn on price and lock-in. Against Zitadel neither argument works: both are open source, both self-host, both speak OIDC, OAuth 2.0 and SAML. What actually separates them is the licence you inherit, how you federate users that already exist, and whether your custom login logic runs inside the server or on an endpoint you have to host. Checked against Keycloak 26.8.1 and Zitadel v4.20.0 on 2 November 2026.

Open-source parity with
OktaAuth0PingWorkOSOneLogin
At a glance
Full table →
ZitadelYou
Keycloak
Open source and self-hostable
Permissive licence (Apache 2.0)
LDAP / AD federation with sync
Extend it without writing Java
Runs as one service plus a database
Idle memory, quickstart as published~249 MB~611 MB
The short version

Keycloak vs. Zitadel at a glance

DimensionZitadelKeycloak (with Phase Two)
LicenceAGPL-3.0-only, with proto/ and the docs under Apache 2.0 and the login app and client SDKs under MIT; a commercial licence is sold alongside✓Apache 2.0 throughout
Project governanceSingle-vendor project; contributions accepted only under Apache 2.0 while the distribution is AGPL✓CNCF Incubating project, accepted 10 April 2023
ImplementationGo, event-sourced on PostgreSQL 14-18Java on Quarkus; postgres, mysql, mariadb, oracle, mssql or tidb
Deployment shapePublished quickstart runs four containers: proxy, Go API, Next.js login app, PostgreSQL✓One server process and one database
Login UI customizationConsole branding — logo, colours, font, watermark toggle. Past that you fork the MIT login app and run it yourself✓Themes override any login, account or email template, deployed into the server
Existing LDAP or Active DirectoryLDAP configured as an identity provider: bind at login, attributes mapped at login✓User storage provider with READ_ONLY / WRITABLE / UNSYNCED edit modes, periodic sync, and a Kerberos bridge
Custom logic in a login flowActions v2 — Zitadel calls an HTTP endpoint you host, in any languageAuthenticator SPI — your Java runs in-process; the running server reports 139 provider interfaces
Multi-tenancyInstances and organizations, in the core productRealms, or one realm with the open-source Organizations extension
Audit trailEvent-sourced: every state change is an event, and the event store is the system of recordAdmin and user events in the database; retention and external sinks are configuration
Managed optionZitadel Cloud, billed by daily active users; EU, US, Switzerland and Australia✓Any cloud or region you like, or a dedicated cluster at a fixed monthly price
01 — Common ground

Start with what is not different

The arguments that carry a Keycloak comparison against a commercial platform — no per-user licence, no cloud-only deployment, source you can read — all apply to Zitadel too. It is a real open-source identity server, it self-hosts, and it is actively developed: 45 releases published so far in 2026 against Keycloak's 21.

Both of them, verified on the versions above:

  • Implement OpenID Connect, OAuth 2.0 and SAML 2.0, and serve SAML IdP metadata.
  • Support the device authorization grant, JWT bearer, token introspection and revocation, and back-channel logout.
  • Sign with EdDSA, RSA and ECDSA, and publish a discovery document at a well-known URL.
  • Federate to external OIDC and SAML providers, plus the usual social logins.
  • Do SCIM 2.0 — Zitadel in the core product, Keycloak through the open-source Organizations extension we maintain.

So the honest version of this page is not "Zitadel is the cheap option and Keycloak is the real one." Zitadel is genuinely better at several things, and we say which in the last section. What follows is the set of differences that actually change an architecture.

02 — Licence

Apache 2.0 and AGPL-3.0 are not the same offer

This is the first real fork and the one most comparisons skip. Keycloak is Apache 2.0. Zitadel's server is AGPL-3.0-only, and the repository's own LICENSING.md is the authority on the carve-outs.

WhatLicence
Zitadel serverAGPL-3.0-only
proto/ and the documentationApache 2.0
The login app and the client/proto packagesMIT
Inbound contributionsApache 2.0 only — the project will not accept them under the AGPL it ships
All of KeycloakApache 2.0

For most teams this changes nothing. Running an unmodified Zitadel to log users into your product is use, not distribution. The AGPL's network clause bites when you modify the server and let third parties interact with your modified version over a network. At that point you owe those users the corresponding source, and the licence reaches the "work based on the Program", a boundary that is argued rather than settled. Zitadel's own licensing policy says plainly that determining compliance is your responsibility and recommends legal counsel, and its self-hosting page sells a commercial agreement that replaces the AGPL so that you can, in its words, "keep your modifications private".

That is a reasonable position, and it is also the thing to notice: under AGPL the upstream vendor is the only party who can relieve you of the obligation, and the Apache-2.0-inbound rule is what keeps them able to. Apache 2.0 has no equivalent conversation, and that matters most to exactly the teams who are likeliest to need it: anyone shipping identity inside an appliance, embedding it in a product, or patching the server to fit a regulator.

03 — Defaults

What each server advertises out of the box

We started both at their published quickstarts and read the discovery documents. No tuning, no feature flags, defaults only. Keycloak's document carries 56 keys, Zitadel's 29. Reproduce it in two commands:

# Keycloak 26.8.1
curl -s http://localhost:8080/realms/master/.well-known/openid-configuration

# Zitadel v4.20.0
curl -s http://localhost:8080/.well-known/openid-configuration
Advertised at defaultsZitadel v4.20.0Keycloak 26.8.1
Authorization code + PKCES256 onlyS256 and plain
Hybrid flow (code id_token)noyes
Resource owner password grantnoyes
Token exchange (RFC 8693)not advertisedadvertised
CIBAnoyes
Pushed authorization requestsnoyes
DPoPnoyes
mTLS client auth and bound tokensnoyes
Dynamic client registrationoff by defaulton
iss in the authorization response (RFC 9207)noyes
Front-channel logoutnoyes
ui_locales advertised22 localesnot advertised

Read that table carefully, because a discovery document is not a feature list. Two of those rows prove it in opposite directions. Zitadel does implement RFC 8693 token exchange and RFC 7591 dynamic client registration — the registration endpoint only appears in discovery once it is turned on in the instance's security settings, which is visible in the server source, and token exchange is enabled per application rather than globally. Going the other way, Keycloak advertises the token exchange grant, but the legacy flavour that covers brokering and impersonation is still a preview feature and is disabled unless you ask for it. Both servers can do more than they say, and one of them says more than it does.

What the table is good for is the shape of each project. Keycloak's defaults carry the later OAuth hardening work — PAR, DPoP, mTLS-bound tokens, RFC 9207 — because large regulated deployments ask for it, and it also still ships the password grant, which Zitadel does not and which you should not be using either. Zitadel's defaults are narrower and in two places safer: S256-only PKCE and no ROPC are the choices you would make yourself.

The receipts

See it side-by-side

What you actually get for what you actually pay.

Feature & cost comparison
ZitadelYou
Keycloak + Phase Two
Open source
Permissive licence (Apache 2.0)
Vendor-neutral foundation governance
OIDC, OAuth 2.0 and SAML 2.0
PAR, DPoP and mTLS-bound tokens at defaults
LDAP / AD federation with sync and write-back
Kerberos desktop SSO
Full template-level login customization
Extend without writing Java
Multi-tenancy in the core product
Event-sourced audit trail by default
Runs as one service plus a database
Managed, in any cloud or region you choose
Fixed monthly cost — no per-user or per-day meter
04 — Extensibility

In-process Java, or an endpoint you host

Every identity project eventually needs logic that is specific to you: a check against an internal system before a user is created, a claim computed from somewhere else, a step in the login that nobody else has. The two answers are different enough to decide the whole choice.

Zitadel — Actions v2Keycloak — SPI
Where your code runsOn an HTTP endpoint you host and operateInside the server process
LanguageAnything that serves a POSTJava, packaged as a JAR
To deploy a changeDeploy your endpoint. Zitadel is untouchedRebuild and restart the server
Cost on the login pathA network round trip, plus the failure modes of oneA method call
ReachThe request, the response, defined functions and events139 provider interfaces on the running server — storage, authenticators, mappers, policies
What breaks on upgradeYour contract with a documented APIYour JAR, against internal interfaces that are not a stable API

If your team does not write Java, Zitadel's model is the better one and it is not close. Nothing in the server has to be rebuilt, the blast radius of a bad action is an endpoint you can roll back, and a Go or TypeScript shop stays in its own language.

The price is that the extension point is now a service: it needs to be deployed, kept up, authenticated, and kept fast enough to sit in a login. If it is down, the thing it was guarding is down with it. Keycloak's answer has the opposite shape: nothing extra to operate, no round trip, and far deeper access to the model, in exchange for writing Java and for a provider that can break on an upgrade because the SPIs it binds to are internal. One is an integration problem, the other is a maintenance problem. Pick the one your team already knows how to carry.

05 — Users

The users you already have, somewhere else

If every user will be created in the new system, skip this section. If they live in Active Directory or an LDAP server today, it is probably the deciding one.

Zitadel treats LDAP as an identity provider. Its own documentation describes the login sequence: connect, bind with the service account, search for the user DN, bind again as that user with the submitted password, map attributes. It is authentication at login time. It is correct, simple, and tied to the LDAP server being reachable at the moment someone signs in.

Keycloak treats LDAP as user storage, which is a different thing. Users are imported or read through, and the provider's edit mode decides which way writes flow:

  • READ_ONLY — the directory is authoritative; attributes and passwords cannot be changed through Keycloak.
  • WRITABLE — changes to mapped attributes and to passwords are written back to LDAP.
  • UNSYNCED — changes are kept in Keycloak's database for an administrator to reconcile, which is how you add attributes to users held in a directory you are not allowed to write to.

On top of that sit LDAP mappers for groups and roles, a periodic full sync and a changed-users sync, and a Kerberos bridge for desktop single sign-on. Verified against the Keycloak 26.8.1 server administration guide.

The practical difference: an organization with an existing directory, group-derived authorization and desktop SSO gets all of that from Keycloak as configuration. With Zitadel the login works and the rest is yours to build, through the provisioning APIs, SCIM, or an action. Our Keycloak identity provider documentation covers the brokering side, and SCIM explained covers the provisioning side.

06 — Verdict

When you should not pick Keycloak

Zitadel is the better answer when:

  • Footprint matters. Idle, immediately after start, on a 2-CPU 8 GB machine: the four containers of Zitadel's published compose stack came to about 249 MB, Keycloak's quickstart to about 611 MB. There are caveats in both directions. Keycloak sizes its heap from the memory limit it is given, and that figure is development mode with an embedded database while Zitadel's includes a real PostgreSQL. But a Go binary against a JVM is a real difference, and in a homelab or a small edge deployment it is the one you feel first.
  • You are building multi-tenant SaaS and do not want to think about it. Instances and organizations are in the core product. Keycloak's realm model does not stretch to a realm per customer, which is why we maintain an organizations extension and wrote up the multi-tenancy options in full.
  • Audit is a requirement rather than a feature. Event sourcing means the history is the storage model, not a log you enabled. Keycloak can get you there, but event storage is something you have to plan for.
  • Nobody on the team writes Java, and the custom logic is more than a mapper.
  • You want a maintained login UI you can fork. Zitadel's login app is a separate MIT-licensed Next.js service, and the seam is designed in rather than worked around.

Keycloak earns it when:

  • Apache 2.0 is worth something to you — you embed, redistribute, or patch the server, and you would rather not be in a licensing conversation with its vendor.
  • There is a directory. LDAP and Active Directory federation with writable edit modes, group mapping, scheduled sync and Kerberos is a large amount of work to not have to do.
  • Your security review has a list. PAR, DPoP, mTLS-bound tokens, CIBA — present and advertised at the defaults.
  • You need to reach into the model. 139 provider interfaces, and a custom authenticator that runs in-process rather than over a network hop.
  • The ecosystem is the point. A CNCF Incubating project with many independent vendors behind it is a different kind of bet from a single-vendor project, both for support and for hiring people who have already run it.

And the honest closing note, which applies to either choice: the operations bill is real. Keycloak is a JVM application with a database, a cache and an upgrade cadence, and running it well is a job. That is the argument for managed Keycloak at a fixed monthly price rather than a per-user meter. If you would rather run it yourself, we also support teams who do. If residency is driving the decision, our EU data residency page states where identity data sits and where it does not, including the parts that are not flattering.

Migration

Evaluating both, or already on one?

Moving between two standards-based identity servers is mostly client configuration and a user import. The expensive parts are the custom logic and whatever your directory is doing. We will tell you plainly which of the two fits, including when the answer is not us.

See how we migrate teams to Keycloak
How we deliver

Two ways to run Keycloak with Phase Two

Managed Hosting

Managed Keycloak Hosting

Multi-region, high-availability Keycloak with 100+ extensions. Simple, cost-conscious, and customizable.

  • Unlimited users on every tier
  • Up to 99.99% uptime SLA & SOC 2
  • Custom domains & branding
  • Dedicated clusters from $149/month
Enterprise Support

Enterprise Keycloak Support

Run your own Keycloak? Get expert escalation, security patches, and architecture guidance — at any level of complexity.

  • 24/7 escalation with named engineers
  • Security advisories & patch backports
  • Architecture & migration reviews
  • Dedicated Slack channel
Learn more
FAQ

Frequently asked questions

Is Zitadel a good alternative to Keycloak?

Yes, and unusually for this page the comparison is close. Zitadel is a genuine open-source identity server with OIDC, OAuth 2.0, SAML and SCIM, a much smaller runtime footprint, multi-tenancy in the core product, and an extension model that does not require Java. Keycloak answers back with Apache 2.0 licensing, LDAP and Active Directory federation with write-back and scheduled sync, Kerberos, a broader OAuth surface at its defaults, and CNCF governance with many independent vendors behind it. Teams with an existing directory, or who embed or modify the server, usually land on Keycloak.

Is Zitadel open source, and does the AGPL licence matter?

Zitadel's server is licensed AGPL-3.0-only, with its proto definitions and documentation under Apache 2.0 and its login app and client packages under MIT. For a team running an unmodified Zitadel as its identity provider, the licence changes nothing. It matters when you modify the server and let third parties use the modified version over a network, or when you redistribute or embed it: then AGPL obligations attach, and Zitadel sells a commercial licence as the alternative. Keycloak is Apache 2.0 throughout, which has no equivalent condition.

Does Zitadel support LDAP and Active Directory like Keycloak does?

Not in the same way. Zitadel configures LDAP as an identity provider: at login it binds with a service account, searches for the user, binds again with the submitted password, and maps attributes. Keycloak configures LDAP and Active Directory as user storage, with READ_ONLY, WRITABLE and UNSYNCED edit modes, mappers for groups and roles, periodic full and changed-user synchronization, and a Kerberos bridge for desktop single sign-on. If your authorization is derived from directory groups, that difference is most of the project.

Which is lighter to run, Keycloak or Zitadel?

Zitadel, measurably. Idle and immediately after start on a 2-CPU, 8 GB machine, the four containers of Zitadel v4.20.0's published compose stack used about 249 MB in total, and Keycloak 26.8.1's quickstart container about 611 MB. Two caveats: Keycloak sizes its JVM heap from the memory limit it is given, so that number moves with the limit, and the Keycloak figure is development mode with an embedded database while the Zitadel figure includes a real PostgreSQL. Neither is a production sizing, but a Go binary is lighter than a JVM and will stay that way.

Can I customize the login page in Zitadel the way Keycloak themes let me?

Up to a point. Zitadel's console covers logo, colours, font and a watermark toggle, per instance or per organization. Beyond that the route is to fork its login application, a separate Next.js service under the MIT licence, and run your own. Keycloak themes override any template, message bundle or asset in the login, account and email flows, and deploy into the server with no extra service to operate. Which is better depends on whether a second deployable is a cost or a feature for you.

Does Keycloak support multi-tenancy as well as Zitadel?

Not in the core product. Zitadel has instances and organizations built in. Keycloak gives you realms, which are isolated but heavy, and a realm per customer stops scaling long before a SaaS tenant list does. The workable Keycloak pattern is one realm with organizations inside it, which is why we build and maintain an open-source organizations extension with SCIM 2.0 provisioning. If multi-tenancy is the whole product and you are starting from nothing, this is the strongest argument on Zitadel's side.

Two open-source servers. One decision.

A 30-minute architecture review covering your directory, your tenancy model and the custom logic you need, and a straight recommendation.