Against authentik the usual Keycloak arguments do not work: both self-host, both are free to run, both speak OIDC, OAuth 2.0 and SAML. The real fork is that authentik's core is MIT while a directory inside the same repository — and the same container image — is proprietary and priced per seat, and that each server reaches in a different direction: authentik down the stack to apps that speak no auth protocol at all, Keycloak out to the directory you already have and into the later OAuth hardening work. Checked against Keycloak 26.8.2 and authentik 2026.8.5 on 9 November 2026.
| authentik | You Keycloak | |
|---|---|---|
| Open source and self-hostable | ||
| Every feature under the open-source licence | ||
| Protects apps that speak no auth protocol | ||
| LDAP / AD federation with write-back | ||
| PAR, CIBA and mTLS-bound tokens at defaults | ||
| Idle memory, quickstart as published | ~688 MB | ~512 MB |
| Dimension | authentik | Keycloak (with Phase Two) |
|---|---|---|
| Licence | MIT, except the authentik/enterprise/ directory, which is proprietary and needs a paid subscription to run in production | ✓Apache 2.0 throughout, with no directory carved out |
| Paid tier from the project | Enterprise at $5/user/month for workforce accounts, $0.02 for customer accounts; Enterprise Plus from $20k a year | ✓None. The project sells nothing, and no feature is gated |
| Project governance | Single-vendor project. Authentik Security, Inc., a public benefit company founded November 2022; the project's creator is its CTO | ✓CNCF Incubating project, accepted 10 April 2023 |
| Implementation | Python on Django, with Go and Rust components; PostgreSQL | Java on Quarkus; postgres, mysql, mariadb, oracle, mssql or tidb |
| Deployment shape | Published compose runs three containers: server, worker, PostgreSQL. The worker mounts the Docker socket | ✓One server process and one database |
| Apps that speak no auth protocol | Proxy provider in forward-auth or full-proxy mode, plus LDAP, RADIUS and browser RDP/SSH providers | Not in the project. You run a separate authenticating proxy in front |
| Existing LDAP or Active Directory | LDAP source: scheduled inbound sync of users and groups, with password change written back through the Active Directory extended operation | ✓User storage provider with READ_ONLY / WRITABLE / UNSYNCED edit modes, registration sync back to LDAP, periodic sync and a Kerberos bridge |
| SCIM 2.0 | Both directions in the open-source tier — inbound source and outbound provider. OAuth 2.0 auth to SCIM endpoints is Enterprise | Inbound SCIM API, supported since 26.8, off per realm by default. Outbound provisioning comes from the open-source Organizations extension |
| Custom logic in a login flow | Python expressions written in the admin console and executed in the server process | Authenticator SPI — your Java runs in-process; the running server reports 139 provider interfaces |
| Login UI customization | Per-domain brands: title, logo, favicon and custom CSS, plus overridable email templates | ✓Themes override any login, account, admin, welcome or email template, deployed into the server |
| OpenID certification | Certified on a current build — authentik 2026.8.0, eight OP profiles | Certified as Keycloak 18.0.0 (2022) for four logout profiles, and 15.0.2 for FAPI-CIBA |
| Managed option | Self-host only. The vendor sells a licence and support, not hosting | ✓Any cloud or region you like, or a dedicated cluster at a fixed monthly price |
The arguments that carry a Keycloak comparison against a commercial platform — no per-user licence, no cloud-only deployment, source you can read — mostly apply to authentik too. It is a real open-source identity server, it self-hosts, and it is developed at pace: 31 releases published so far in 2026 against Keycloak's 22.
Both of them, verified on the versions above:
So the honest version of this page is not "authentik is the hobby option." On several axes authentik is simply better, and we say which in the last section. What follows is the set of differences that actually change an architecture or a budget.
Read only the badge and authentik wins this: MIT is about as permissive as a licence gets, and Apache 2.0 asks slightly more of you — a NOTICE file, a patent grant, attribution on modified files. But the badge is not the offer. The repository's own LICENSE carves out directories, and one of them is not open source at all.
| What | Licence |
|---|---|
| Most of authentik | MIT |
| Client-side JavaScript | MIT Expat |
| website/ | CC BY-SA 4.0 |
| authentik/enterprise/ | The authentik Enterprise Edition licence |
| All of Keycloak | Apache 2.0 |
The Enterprise licence says the code in that directory "may only be used in production" with a valid subscription for the correct number of seats, that it is "forbidden to copy, merge, publish, distribute, sublicense, and/or sell" it, and that any patch you write to it belongs to Authentik Security, Inc. You may read it and you may modify it for development and testing. That is source-available, and it is a normal open-core arrangement — but it is the opposite of what MIT implies, and it sits in the same tree.
You do not have to guess, because a running server will tell you. Each component endpoint reports a requires_enterprise flag per type. On a freshly started, entirely unlicensed 2026.8.5:
for t in providers sources stages propertymappings policies; do
curl -s -H "Authorization: Bearer $AK_TOKEN" \
"http://localhost:9000/api/v3/$t/all/types/" \
| python3 -c 'import sys,json; d=json.load(sys.stdin); \
print(len(d), sum(1 for r in d if r["requires_enterprise"]))'
done| Component | Types | Enterprise only |
|---|---|---|
| Providers | 12 | 4 — Google Workspace, Microsoft Entra, Shared Signals Framework, WS-Federation |
| Stages | 25 | 4 — Account Lockdown, Mutual TLS, Source, Google device trust connector |
| Property mappings | 15 | 2 — the Google Workspace and Entra mappings |
| Policies | 7 | 1 — Password Uniqueness |
| Sources | 22 | 0 |
| Total | 81 | 11 |
Eleven of eighty-one is not a crippled product. The open-source tier covers OIDC, SAML, LDAP, RADIUS, SCIM, Kerberos, the proxy and browser-based remote access, and most teams will never touch the other eleven. The vendor's pricing page adds a few more items that are not component types — privileged access management, exportable reports, enhanced audit logging, RADIUS EAP-TLS, OAuth 2.0 authentication on SCIM endpoints — and lists the price: $5 per workforce user per month, $0.02 per customer account, billed annually, with Enterprise Plus starting at $20,000 a year.
The point is not that the price is high. Against a commercial IAM vendor it is low. The point is that it is a per-seat meter on software you are hosting yourself, and that is the exact thing most people are leaving when they go looking for a Keycloak alternative. Keycloak has no such tier: the project sells nothing, gates nothing, and counts nobody. Everything in it is Apache 2.0.
The Enterprise code ships inside the ordinary container image and is enabled by a licence key, which is convenient and has one consequence worth planning for. If a licence expires, or your user count goes past what you bought, authentik records the state and escalates: a warning to admins after two weeks, to users after four, and after six weeks it puts the API into read-only mode. The middleware then refuses every unsafe API request with HTTP 400 and denied_license.
Read the exclusions before you panic, because they are generous: GET, HEAD, OPTIONS and TRACE always pass, the flow executor is explicitly exempt so logins keep working, user create and update keep working, and the licence endpoints keep working so you can fix it. It is a configuration freeze, not an outage. It also never applies to an unlicensed install — a pure open-source deployment has no licence to expire. But it is a failure mode that exists only because there is something to buy, and it is worth knowing about before the renewal rather than six weeks after it.
We started both at their published quickstarts and read the discovery documents. No tuning, no feature flags, defaults only — in authentik's case an OAuth2 provider created with the signing certificate and the three scope mappings the admin wizard assigns. Keycloak's document carries 56 keys, authentik's 26, and every key authentik publishes, Keycloak publishes too. Reproduce it in two commands:
# Keycloak 26.8.2
curl -s http://localhost:8080/realms/master/.well-known/openid-configuration
# authentik 2026.8.5 — discovery is per application, not per server
curl -s http://localhost:9000/application/o/<app-slug>/.well-known/openid-configuration| Advertised at defaults | authentik 2026.8.5 | Keycloak 26.8.2 |
|---|---|---|
| Authorization code + PKCE | S256 and plain | S256 and plain |
| DPoP | 9 algorithms | 10 algorithms |
| Device authorization grant | yes | yes |
| Front- and back-channel logout | yes | yes |
| Resource owner password grant | yes | yes |
| Pushed authorization requests | no | yes |
| CIBA | no | yes |
| mTLS client auth and bound tokens | no | yes |
| private_key_jwt client auth | no | yes |
| Token exchange (RFC 8693) | no | advertised |
| iss in the authorization response (RFC 9207) | no | yes |
| Dynamic client registration | not advertised | advertised |
| Request objects / request_uri | no | yes |
| Pairwise subject identifiers | no | yes |
| ID token signing algorithms | RS256 | 13 algorithms |
| Token, userinfo and authz response encryption | no | yes |
Read that table carefully, because a discovery document is not a feature list. Two rows prove it in opposite directions. authentik does implement dynamic client registration — it ships a managed goauthentik.io/oidc/dcr scope mapping for exactly that — and simply does not advertise the endpoint. Going the other way, Keycloak advertises the token exchange grant, but on a default profile the token-exchange feature is disabled and the broader flavour is still preview. Both servers 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, CIBA, mTLS-bound tokens, RFC 9207, encrypted tokens, request objects — because large regulated deployments ask for it, and the cost is a much bigger surface to configure and review. authentik's surface is the part almost everyone uses, and that is a defensible choice. If your security review arrives with a list of RFC numbers on it, read that list against this table before you go any further.
One asymmetry in authentik's favour, since it belongs here: its OpenID Foundation certification is current. The certified implementations list carries authentik 2026.8.0 across eight OP profiles. Keycloak's entries on the same list are Keycloak 18.0.0, certified in 2022, and 15.0.2 for FAPI-CIBA. Keycloak implements more of that surface today than it has ever certified — but a certification nobody has refreshed in four years is a fair thing for a reviewer to raise, and we would rather say so here than be asked.
What you actually get for what you actually pay.
| authentik | You Keycloak + Phase Two | |
|---|---|---|
| Open source | ||
| Every feature under the open-source licence | ||
| No per-seat licence from the project | ||
| Vendor-neutral foundation governance | ||
| OIDC, OAuth 2.0 and SAML 2.0 | ||
| DPoP at defaults | ||
| PAR, CIBA and mTLS-bound tokens at defaults | ||
| Current OpenID Provider certification | ||
| LDAP / AD federation with write-back and registration sync | ||
| Kerberos desktop SSO | ||
| Outbound SCIM provisioning | ||
| Reverse proxy / forward auth for protocol-less apps | ||
| Serves LDAP and RADIUS to legacy clients | ||
| Full template-level login customization | ||
| Extend without writing Java | ||
| Runs as one service plus a database | ||
| Managed, in any cloud or region you choose |
This is authentik's strongest argument and it has nothing to do with OIDC. Most estates contain software that cannot be made to speak OIDC or SAML: an internal dashboard with no auth, a NAS, a wiki from 2014, a network appliance that only knows RADIUS, a Windows box somebody still has to reach. authentik has an answer for each of those in the product.
| Thing you need to put a login in front of | authentik | Keycloak |
|---|---|---|
| An HTTP app with no authentication of its own | Proxy provider, in proxy, forward_single or forward_domain mode behind nginx, Traefik or Envoy | Not in the project — run a separate authenticating proxy |
| An app that can only bind to LDAP | LDAP provider: authentik serves LDAP | No. Keycloak consumes LDAP, it does not serve it |
| A VPN concentrator or switch that speaks RADIUS | RADIUS provider (EAP-TLS is Enterprise) | Not in the project |
| A desktop or server over RDP, VNC or SSH | RAC provider, in the browser, in the open-source tier | Not in the project |
Those providers run as outposts — separate processes that authentik can deploy for you, which is why the published compose file mounts the Docker socket into the worker container and runs it as root. That is a deliberate design and it is documented, but it means the worker holds host-level control of the Docker daemon. If that is not acceptable where you are deploying, run the outposts yourself and drop the mount.
Keycloak's position here is simple and worth stating plainly: it is an identity provider and nothing else. There is no proxy, no LDAP server, no RADIUS, no remote desktop. We wrote the LDAP federation tutorial partly to answer "can Keycloak act as an LDAP server", and the answer there is the same as here: no, the traffic goes one way. The usual Keycloak estate puts oauth2-proxy or an ingress-level authenticator in front of the protocol-less apps and keeps the identity server doing identity.
Which model is better is a real question rather than a rhetorical one. One box that does all of it is fewer things to run and fewer places for a session to get lost. It is also a much larger blast radius: the thing issuing your tokens is now also terminating your RDP sessions and proxying your intranet. Decide that on your own risk appetite, not on a feature count.
If every user will be created in the new system, skip this section. If they live in Active Directory today, or if an HR system needs to push them in, it is probably the deciding one.
authentik treats LDAP as a source: a scheduled inbound synchronization of users and groups, with group hierarchy, optional password synchronization, and the option to delete objects that have disappeared upstream. Password changes made in authentik are written back, through the Active Directory extended operation. Other attribute changes are not: the sync is inbound.
Keycloak treats LDAP as user storage, which is a different thing, and the 26.8 server administration guide defines the three edit modes:
On top of that sit twelve LDAP mapper types on a stock 26.8.2 server, a Sync Registrations switch that creates new Keycloak users in LDAP, periodic full and changed-user synchronization, and a Kerberos bridge for desktop single sign-on.
SCIM is where this comparison has recently moved, and most pages on the subject are out of date. Both servers do SCIM 2.0; they point opposite ways.
| authentik 2026.8.5 | Keycloak 26.8.2 | |
|---|---|---|
| Inbound — something provisions users into the server | SCIM source, open-source tier | SCIM API, promoted from preview to supported in 26.8 |
| Outbound — the server provisions users into downstream apps | SCIM provider, open-source tier. OAuth 2.0 auth to the endpoint is Enterprise | Not in core. The open-source Organizations extension does it |
Keycloak's SCIM API is off until you turn it on per realm, needs a confidential client, and validates that the access token's aud claim is the SCIM base URL — a detail that costs an hour if you miss it, because the failure is a 401 that looks like a permissions problem. Once it is on, its own ServiceProviderConfig reports PATCH and filtering supported, with bulk, sort and ETag not supported:
# Keycloak 26.8.2, after enabling SCIM on the realm and adding an
# audience mapper for http://localhost:8080/realms/master/scim/v2
curl -s -H "Authorization: Bearer $TOKEN" \
http://localhost:8080/realms/master/scim/v2/ServiceProviderConfig
{"patch": {"supported": true},
"filter": {"supported": true, "maxResults": 100},
"bulk": {"supported": false},
"sort": {"supported": false},
"etag": {"supported": false}}The practical read: an organization with an existing directory, group-derived authorization and desktop SSO gets all of that from Keycloak as configuration, while authentik gives you the login and leaves the rest to its provisioning APIs. Going the other way, if what you need is to push users out to a dozen SaaS applications, authentik has that in the box and Keycloak needs our organizations extension. Our SCIM explainer covers the protocol itself, and Keycloak identity provider documentation covers the brokering side.
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.
| authentik — expressions | Keycloak — SPI | |
|---|---|---|
| Where you write it | A text box in the admin console | A Java project on your machine |
| Language | Python | Java, packaged as a JAR |
| Where it runs | In the server process, via exec() | In the server process |
| To deploy a change | Press save | Rebuild and restart the server |
| Composing a login journey | 25 stage types arranged into flows in the UI | 42 authenticators arranged into flows in the UI |
| Adding a new kind of step | Not without forking | 139 provider interfaces on the running server |
| What breaks on upgrade | Your expression, against a documented object model | Your JAR, against internal interfaces that are not a stable API |
If your team does not write Java, authentik's model is better and it is not close. A rule you can write, save and test in the same minute is a different experience from a Maven build and a rolling restart, and for the large class of problems that are really "branch this flow on an attribute", it is the right tool.
Two things to price in. The first is that an expression is arbitrary Python executed inside the server process — authentik's own documentation says so, and calls the ability to create or edit one "a highly privileged permission". Your admin console is a code-execution surface, and your delegation model has to treat it as one. Keycloak's nearest equivalent, script authenticators and mappers, is a preview feature that is disabled by default and still requires a deployed JAR carrying META-INF/keycloak-scripts.json, which is inconvenient on purpose.
The second is depth. Keycloak's SPIs let you replace parts of the server that authentik does not expose at all — a user storage backend, a credential type, a new kind of authentication step, a protocol mapper over the token. We build and maintain open-source extensions on exactly those interfaces, which is also how we know the trade: they are internal interfaces, they move between releases, and a provider written against them is something you own and have to carry.
authentik is the better answer when:
Keycloak earns it when:
And the honest closing note, which applies to either choice: the operations bill is real, and neither of these is light. Keycloak is a JVM application with a database, a cache and an upgrade cadence; authentik is three containers, a Docker socket and two supported release trains at a time. Idle on a 2-CPU, 8 GB machine immediately after start, authentik's published compose stack came to about 688 MB across its three containers and Keycloak's quickstart to about 512 MB — with the caveat that Keycloak sizes its heap at 70% of the memory limit it is given, so that figure moves with the limit, and that the Keycloak number is development mode with an embedded database while authentik's includes a real PostgreSQL. Neither is a production sizing. The reflex that Keycloak is the heavy one does not survive measurement.
Running either 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 support teams who do, and we publish backport images for older Keycloak branches because upstream tags them without announcing them. 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.
Moving between two standards-based identity servers is mostly client configuration and a user import. The expensive parts are the custom logic, whatever your directory is doing, and anything sitting behind a forward-auth proxy. We will tell you plainly which of the two fits, including when the answer is not us.
See how we migrate teams to KeycloakMulti-region, high-availability Keycloak with 100+ extensions. Simple, cost-conscious, and customizable.
Run your own Keycloak? Get expert escalation, security patches, and architecture guidance — at any level of complexity.
For a lot of teams, yes. authentik is a genuine open-source identity server with OIDC, OAuth 2.0, SAML, SCIM, LDAP and Kerberos, a flow builder you drive from the admin console, Python expressions instead of Java, and — uniquely among the usual Keycloak alternatives — providers that put a login in front of applications that speak no authentication protocol at all, including a reverse proxy, an LDAP server, RADIUS and browser-based RDP and SSH. Keycloak answers with Apache 2.0 across the whole project and no paid tier, LDAP and Active Directory federation with writable edit modes and registration sync, a much broader OAuth surface at its defaults, 139 extension interfaces, and CNCF governance with many independent vendors behind it.
Most of authentik is MIT, but the authentik/enterprise/ directory of the same repository is under a proprietary Enterprise Edition licence that permits production use only with a paid subscription for the correct number of seats and forbids redistribution. On a running 2026.8.5 server, 11 of the 81 provider, source, stage, property-mapping and policy types report that they require Enterprise — including the Google Workspace and Microsoft Entra providers, Shared Signals Framework, WS-Federation, a mutual-TLS stage and the password-uniqueness policy. Enterprise is priced at $5 per workforce user per month and $0.02 per customer account, billed annually. Keycloak is Apache 2.0 throughout and the project has no paid tier at all.
No. Keycloak is an identity provider and nothing else — there is no proxy provider, no LDAP server, no RADIUS and no remote desktop access in the project. authentik has all four, and its proxy provider runs in full-proxy, single-application forward-auth or domain-level forward-auth mode behind nginx, Traefik or Envoy. The usual Keycloak equivalent is to put a separate authenticating proxy such as oauth2-proxy in front of the applications that cannot speak OIDC, which works well but is another component to run.
Yes, as of Keycloak 26.8, and this is the fact most comparisons still get wrong. The SCIM API was a preview feature in 26.7 and is supported in 26.8. It is inbound: other systems provision users and groups into a Keycloak realm. You enable it per realm, call it with a confidential client, and the access token's aud claim has to be the realm's SCIM base URL. Its ServiceProviderConfig reports PATCH and filtering supported, and bulk, sort and ETag not supported. Outbound provisioning — Keycloak pushing users to downstream applications — is not in core and comes from our open-source Organizations extension. authentik has both directions in its open-source tier.
Keycloak, which surprises people. Idle and immediately after start on a 2-CPU, 8 GB machine, the three containers of authentik 2026.8.5's published compose stack used about 688 MB in total — 371 MB for the server, 266 MB for the worker, 51 MB for PostgreSQL — while Keycloak 26.8.2's quickstart container used about 512 MB under a 1.5 GB limit. Two caveats in Keycloak's disfavour and one in its favour: Keycloak sizes its JVM heap at 70% of the memory limit it is given, so that number rises if you give it more; the Keycloak figure is development mode with an embedded database while authentik's includes a real PostgreSQL; and Keycloak is one container against three. Neither is a production sizing, but "the Java one is the heavy one" is not what the measurement says.
Not to the same depth, though the trade is more interesting than it sounds. authentik gives you per-domain brands with a title, logo, favicon and arbitrary custom CSS, plus overridable email templates — and, more importantly, a flow builder that lets you rearrange the login journey itself from 25 stage types without writing anything. Keycloak themes override any template, message bundle or asset across the login, account, admin, welcome and email flows, so the markup is yours, but the flow is composed from the authenticators that exist. If you want to change what the loginlooks like, Keycloak goes further; if you want to change what it does, authentik gets you there faster.