Configuration
Set these in .env next to docker-compose.yml, then run docker compose up -d.
Required
Section titled “Required”| Setting | What it is |
|---|---|
PLAYDEX_DOMAIN |
The name the server answers on. Caddy gets its certificate. |
POSTGRES_PASSWORD |
Database password. Use openssl rand -hex 32, so it’s safe inside a URL. |
JWT_SECRET |
Signs sign-ins. Use openssl rand -hex 32; the API won’t start with fewer than 32 bytes. |
Optional
Section titled “Optional”| Setting | Default | What it does |
|---|---|---|
PLAYDEX_VERSION |
latest |
Image tag. sha-<commit> pins a version. |
TELEGRAM_BOT_TOKEN |
Turns on Telegram notifications. | |
IGDB_CLIENT_ID, IGDB_CLIENT_SECRET |
Turns on game search. | |
AI_DRAFTS_ENABLED |
false |
Turns on AI drafts. Needs a key and a model too. |
AI_DRAFTS_PROVIDER |
openai |
openai or openrouter. |
AI_DRAFTS_BASE_URL |
OpenAI Responses API | The provider’s endpoint. Set it for OpenRouter. |
AI_DRAFTS_API_KEY |
The provider’s API key. | |
AI_DRAFTS_MODEL |
The model ID. | |
SENTRY_DSN |
Sends errors to Sentry. |
Advanced
Section titled “Advanced”The API reads any ASP.NET setting from the environment, with __ between sections. Add these under app.environment in docker-compose.yml:
| Setting | Default | What it does |
|---|---|---|
Polling__IntervalSeconds |
60 |
How often Steam, PlayStation and Xbox are checked. |
Polling__MaxConcurrentPolls |
4 |
How many accounts are checked at the same time. With several API instances, one at a time runs a check. |
Polling__AuthFailuresBeforePause |
10 |
Pause an account after the platform rejects its key or token this many times in a row (about 30 minutes). The user sees why and resumes it after updating the key. 0 never pauses. |
Polling__PollResultRetentionDays |
30 |
How long poll history is kept (the raw platform response only when the game changed). 0 keeps it. |
Auth__AccessTokenTtl |
30m |
How long a sign-in lasts before it refreshes. |
AiDrafts__RequestsPerHour |
10 |
AI draft requests per user per hour. |
AiDrafts__SearchTimeoutSeconds |
20 |
Time for matching extracted titles against IGDB. Titles not matched in time are left for you to pick. |
AiDrafts__HistoryRetentionDays |
30 |
How long AI inputs are kept. |
CORS_ORIGINS |
Comma-separated origins, only if the web app is on another domain than the API. |
Sign-in, token refresh, the capture API and the poster proxy are rate-limited per client IP address. Behind a
reverse proxy on a private network (Caddy in this compose file, Traefik, nginx) the address comes from
X-Forwarded-For; a proxy on a public address isn’t trusted, so put the API behind one on the same host or network.