Skip to content

Configuration

Set these in .env next to docker-compose.yml, then run docker compose up -d.

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.
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.

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.