···2828- `OAUTH_REDIRECT_URI` (e.g. `https://your-app.com/oauth/callback`)
2929- `OAUTH_SIGNING_KEY` (did:key private key for client assertions)
30303131+Generate a signing key with the built-in helper:
3232+3333+```sh
3434+cd backend
3535+cargo run --bin oauth_keygen
3636+```
3737+3838+Set the output as `OAUTH_SIGNING_KEY`.
3939+3140Optional settings:
32413342- `OAUTH_BASE_URL` (if set, derives `OAUTH_CLIENT_ID`, `OAUTH_REDIRECT_URI`, and `OAUTH_JWKS_URI`)
···3544- `OAUTH_CLIENT_URI`
3645- `OAUTH_JWKS_URI`
3746- `OAUTH_SCOPES` (defaults to `atproto transition:generic`)
3838-- `OAUTH_POST_AUTH_REDIRECT` (defaults to `/`)
4747+- `OAUTH_POST_AUTH_REDIRECT` (defaults to `OAUTH_BASE_URL` when set, otherwise `/`)
4848+- `OAUTH_POST_AUTH_REDIRECT_ROUTE` (if set, combines with `OAUTH_BASE_URL` when available)
3949- `OAUTH_COOKIE_NAME` (defaults to `slipnote_session`)
4050- `OAUTH_SESSION_TTL_SECONDS` (defaults to 7 days)
4151- `PLC_HOSTNAME` (defaults to `plc.directory`)
5252+5353+If you do not have a real URL for OAuth callbacks, expose the backend with ngrok:
5454+5555+```sh
5656+ngrok http 3001
5757+```
5858+5959+Then set `OAUTH_BASE_URL` to the ngrok HTTPS URL (for example, `https://abc123.ngrok-free.app`).
42604361## Tilt
4462