Tech Digest

Head to head

Pocket ID vs Authelia

One issues tokens to applications that know how to log a user in. The other stops requests at the proxy. Your list of applications decides which you need, and sometimes it says both.

Last reviewed 2 tools compared

Should you use Pocket ID or Authelia?

Use Pocket ID if every application you want to protect speaks OIDC and your users can use passkeys, because it does that job in 30 MB with an ops load of 1. Use Authelia if any application on your list has no login of its own, since it gates the HTTP request at your reverse proxy regardless of what the app supports. Pocket ID has no forward auth, no proxy outpost and no header injection, so it is worth nothing to an app with no OIDC client. That exclusion, not the passkey requirement, is what decides most installs.

Do not start from the tools. Start from your application list, because it makes this decision for you in about ten minutes.

Write down every service you want behind one login and mark each one: speaks OIDC, reads proxy headers like Remote-User, or neither. Immich, Grafana, Forgejo, Nextcloud and Paperless-ngx land in the first column. A router UI, an old PHP tool, a dashboard someone wrote in a weekend, and anything you are protecting precisely because you do not trust its own login, land in the third.

If the third column is empty, Pocket ID is the better tool and it is not close: 30 MB idle, one container, ops load 1, and no password anywhere. If the third column has entries, you need something that stops requests, which is Authelia.

The rows that matter here#

Look at ops load and container count. Both are single Go binaries with SQLite, so the specs look almost identical, and the operational difference comes from what each one is wired into.

SpecificationPocket IDAuthelia
LicenceBSD-2-Clause (Permissive)Apache-2.0 (Permissive)
Written inGo / SvelteKitGo / TypeScript
First release20242017
MaturityYoungStable
DatastoreSQLite (default) or PostgreSQLSQLite (default), PostgreSQL or MySQL; sessions in memory or Redis
Services to run11
Idle memory30 MB35 MB
Memory in use60 MB80 MB
Operational load1 / 5, Set and forget3 / 5, Moderate
IdentityNative OIDCLDAP only
arm64 buildsYesYes
Default ports14119091
Backup shapeSQLite backupSQLite backup

Pocket ID sits at ops load 1 because nothing is coupled to it: apps redirect to it, it redirects back, and if it is down you cannot log in but nothing else breaks. Authelia sits at 3 because its configuration lives in two places at once, its own YAML and your reverse proxy, and a mistake in either takes down every site behind the proxy.

What each one actually does to a request#

Pocket ID, for an app that speaks OIDC:

  1. You open Immich. It has no session, so it redirects you to https://id.example.com/authorize?....
  2. Pocket ID asks for a passkey. Your phone or password manager answers it.
  3. It redirects back with a code. Immich exchanges it for a token and creates its own session.

The application is logged in. Real single sign-on, in the sense people mean.

Authelia, for any app at all:

  1. You open paperless.example.com. Your proxy pauses and calls Authelia's /api/authz/forward-auth endpoint.
  2. Authelia checks its session cookie. No session means a redirect to the portal, password, then second factor.
  3. The proxy forwards the original request with Remote-User and Remote-Groups headers attached.

The request is authorized. Whether the application logs you in depends entirely on whether it reads those headers. If it does not, your users authenticate at Authelia and then meet a second login form. Say that out loud before you promise anyone single sign-on.

caddyfile
paperless.example.com {
	forward_auth authelia:9091 {
		uri /api/authz/forward-auth
		copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
	}
	reverse_proxy paperless:8000
}

That block is the whole integration for Caddy, and it is also the coupling that Pocket ID has no equivalent of and no ambition to grow one.

What "passkey only" excludes, precisely#

Pocket ID's exclusions are the product, not a roadmap. There is no password login, no SAML, no LDAP server (only inbound sync from one), no forward auth and no proxy outpost. It is on v2.14.0 as of August 2026 after roughly monthly minors, and it passed the OpenID Foundation's conformance suite in 2026, so the part it does do is done properly.

The passkey stance costs two concrete things:

  • Credentials are welded to your domain. Change the host in APP_URL and every passkey your users registered stops working simultaneously. Decide the hostname before you invite anyone.
  • HTTPS is not optional. WebAuthn requires a secure context, so a plain HTTP deployment on a LAN address cannot register a credential at all. The failure is a browser error that never mentions TLS. Reverse proxy and TLS covers getting a certificate on an internal name.

And one human cost: some of your users will not or cannot use passkeys. There is no password fallback by design. For a household where everyone already has synced credentials through iCloud Keychain, Vaultwarden or 1Password, this is invisible. For a family member on an old Android tablet, it is a support call.

What Authelia's flexibility costs#

Authelia protects anything, which is exactly why it has more sharp edges.

  • Sessions are in memory by default. Every restart signs out every user, including anyone mid-way through TOTP enrollment. Adding Redis fixes it and makes your one container two.
  • Cookie domains obey the Public Suffix List. You cannot share a session cookie between example.duckdns.org and example-auth.duckdns.org. Free dynamic DNS subdomains hit this wall first, and the only fix is a registrable domain.
  • Every bypass rule is a hole. Anything that is not a browser needs one: /remote.php/dav for Nextcloud clients, /api/ for a mobile app, whole subdomains for Jellyfin on a TV. Rules are first-match-wins, so one placed too high silently disables two-factor for everything below it.
  • Losing storage.encryption_key is unrecoverable. TOTP secrets and WebAuthn credentials are encrypted at the application layer with a key that lives in your config, not the database. Restore a dump with a different key and everyone re-enrolls.

Pocket ID has the same key-outside-the-database problem in a smaller form: token signing keys are stored encrypted under ENCRYPTION_KEY, so a database backup without it is not usefully restorable. Both belong in a password manager rather than only in the .env file next to the volume.

The OIDC comparison, stated honestly#

Both can issue OIDC, so if your third column is empty you could use either.

Authelia's provider is OpenID Certified and the project still labels it beta: Beta 8, targeted at 4.40.0, with breaking changes that have landed inside minor releases. Authelia has never shipped a 1.0 at all; 4.39.22 is a version string from 2019.

Pocket ID is young (first release 2024) and pre-dates none of that history, but the OIDC issuer is the entire product rather than a second feature, and it is certified too. For pure OIDC, Pocket ID is the more focused implementation and the smaller thing to run.

Where Authelia wins on OIDC is the surrounding machinery: an LDAP directory as a user source, password reset by email, TOTP as well as WebAuthn, and access control rules that apply before the app is reached.

Which one for your situation#

SituationUseWhy
Every app speaks OIDC, users have synced passkeysPocket ID30 MB, ops load 1, and no passwords to leak
Any app on your list has no login at allAutheliaForward auth is the only thing that covers it
Mixed household, someone will not use passkeysAutheliaIt has a password path; Pocket ID deliberately does not
You want 2FA in front of a dozen internal toolsAutheliaThat is the exact job it was built for
You already have LLDAP or OpenLDAPAutheliaIt authenticates against LDAP; Pocket ID only syncs from it
OIDC device enrollment for HeadscalePocket IDSmallest credible issuer for one consumer
You tried authentik and only wanted the issuerPocket IDA thirtieth of the memory, a fraction of the concepts
You need SAMLNeitherSee Authelia vs authentik
You want no second login prompt anywherePocket ID, where possibleForward auth gates requests; only OIDC logs the app in

Running both, and why it is clumsier than it looks#

The tempting arrangement is Pocket ID as the OIDC issuer for capable apps, Authelia as the gate for the rest. It works, and it has a cost people discover late: Authelia cannot federate upward to an external OIDC provider, so it cannot use Pocket ID as its user source. You end up with two user stores, two places to add a person and two places to revoke them.

The mitigation is LLDAP underneath as the one place passwords live, with Authelia authenticating against it and Pocket ID syncing users inward from it. That is three services to do what one identity provider does, which is the point at which authentik and its gigabyte start looking reasonable.

What to do next#

Go make the three-column list. It is the only part of this decision that requires knowing anything, and it produces the answer without further reading. Single sign-on for self-hosters walks through it with the header-auth caveats spelled out, The single sign-on gap has the numbers on how many self-hosted apps support OIDC at all, and whichever you pick, put the encryption key in your password manager before you put a single user in the database.

Questions#

Can Pocket ID protect an app that has no OIDC support?

No. There is no forward auth, no proxy provider and no header injection in Pocket ID at all. It is an OIDC issuer, so it can only sign users into applications that implement an OIDC client. Anything else, a static site, an old PHP tool, a service whose login you do not trust, still needs oauth2-proxy or a similar gateway in front of it, and at that point you are running two products. Authelia covers both cases in one.

What happens to my passkeys if I change the domain?

They all stop working, for everyone, at once. WebAuthn credentials are scoped to a relying party ID derived from the host in APP_URL, so moving from id.home.lan to id.example.com invalidates every registered credential. Recovery is an admin-issued one-time access link per user followed by re-enrollment. Pick the final hostname before you invite anyone, and do not prototype on a name you intend to replace.

Can I run Pocket ID without HTTPS on my LAN?

No. The WebAuthn API only runs in a secure context, so a browser pointed at http://192.168.1.20:1411 renders the login page and then fails registration with an error that never mentions TLS. There is no flag to relax this because the browser enforces it, not Pocket ID. Put Caddy or another proxy with a real certificate in front before your first login attempt.

Does Authelia support passkeys and security keys?

Authelia stores WebAuthn credentials and uses them for two-factor authentication, and it keeps a password store behind that: either a YAML file of Argon2id hashes or an LDAP directory. That is the practical difference. Authelia's model always includes passwords, with the reset flows and SMTP notifier that implies. Pocket ID has no password anywhere, which removes an entire class of problem and adds a different one.

What if a user loses every device with their passkey?

An admin generates a one-time access link for them and they enroll a new credential. If the only admin is the one locked out, you are generating that link from the host or editing the database directly. On install day, create a second admin account with a passkey on different hardware, or enroll a hardware security key and put it in a drawer. This is the single most common way people lock themselves out of Pocket ID.

Can I use Pocket ID as Authelia's identity source?

No, and this catches people out. Authelia cannot federate upward to an external OIDC or social provider; its user source is a YAML file of hashes or an LDAP directory. So running both means two separate user stores, not one chained behind the other. If you want a shared password store under both, put LLDAP underneath and point each at it, accepting that Pocket ID only syncs users inward from LDAP rather than authenticating against it.

Which one is less work to run?

Pocket ID, clearly. It is ops load 1: one container, one volume, SQLite by default, backup is a file copy of a stopped instance plus the ENCRYPTION_KEY. Authelia is ops load 3, not because the binary is hard but because its configuration is coupled to your reverse proxy, sessions default to in-memory, and a restore needs the storage encryption key as well as the database. The recurring cost of Pocket ID is that releases land roughly monthly.

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.