You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sorry for the slow follow-up, @cvlc12. I reproduced this and found the cause.
APP_URL does not control the name Tailscale serves on. The Tailscale machine name comes from SERVICE in .env (the sidecar uses hostname: ${SERVICE}), and Serve uses that machine's ts.net name. APP_URL only tells Pocket ID which URL to use for its own links, OIDC endpoints, and passkeys, so the two have to match by hand.
With SERVICE=pocket-id and APP_URL=https://id.<tailnet>.ts.net, I get exactly what you describe: the app is served at https://pocket-id.<tailnet>.ts.net, while Pocket ID advertises https://id.<tailnet>.ts.net as its issuer.
To run it at https://id.<tailnet>.ts.net:
docker compose down
Set SERVICE=id in .env and keep APP_URL=https://id.<tailnet>.ts.net
Rename the data folder, because the volume path is ./${SERVICE}-data: mv pocket-id-data id-data
docker compose up -d
The existing machine is renamed in your tailnet, so you do not need a new auth key. If you would rather keep the machine name, set APP_URL=https://pocket-id.<tailnet>.ts.net instead.
If id.tld is a custom domain rather than your tailnet name, Tailscale Serve cannot serve it; it only serves the machine's ts.net name.
Activity
jackspiering commentedon Jun 8, 2026
Thank you @cvlc12 . I will check this out tonight.
jackspiering commentedon Jun 8, 2026
I could not figure it out yet, still investigating.
cvlc12 commentedon Jun 23, 2026
no luck on this ?
jackspiering commentedon Oct 2, 2026
Sorry for the slow follow-up, @cvlc12. I reproduced this and found the cause.
APP_URLdoes not control the name Tailscale serves on. The Tailscale machine name comes fromSERVICEin.env(the sidecar useshostname: ${SERVICE}), and Serve uses that machine'sts.netname.APP_URLonly tells Pocket ID which URL to use for its own links, OIDC endpoints, and passkeys, so the two have to match by hand.With
SERVICE=pocket-idandAPP_URL=https://id.<tailnet>.ts.net, I get exactly what you describe: the app is served athttps://pocket-id.<tailnet>.ts.net, while Pocket ID advertiseshttps://id.<tailnet>.ts.netas its issuer.To run it at
https://id.<tailnet>.ts.net:docker compose downSERVICE=idin.envand keepAPP_URL=https://id.<tailnet>.ts.net./${SERVICE}-data:mv pocket-id-data id-datadocker compose up -dThe existing machine is renamed in your tailnet, so you do not need a new auth key. If you would rather keep the machine name, set
APP_URL=https://pocket-id.<tailnet>.ts.netinstead.If
id.tldis a custom domain rather than your tailnet name, Tailscale Serve cannot serve it; it only serves the machine'sts.netname.#352 documents this in the
.envand the README.cvlc12 commentedon Oct 2, 2026
Thanks for following up on this !
I'll try it out