Skip to content

Configuration

reader is configured through environment variables only — no config file for the server. Defaults are loopback-safe.

VariableDefaultPurpose
READER_PORT3737HTTP port. Always binds 127.0.0.1
READER_DB~/.local/share/reader/reader.db (hosted)SQLite database path
READER_WEB_DISTunsetWhen set, the server serves this built SPA directory
VariableDefaultPurpose
READER_ALLOW_PRIVATE_FETCHunsetSet to let the poller and ingestors fetch private/loopback addresses. Leave unset in production
OPENROUTER_API_KEYunsetEnables LLM filtering and digest summaries for ingestors. Without it, filtering fails closed (nothing is dropped)
READER_LLM_MODELserver defaultOpenRouter model for filter/summarize

Per-platform auth can come from the environment or the ingestor config; either way, values are redacted from API responses.

VariablePlatform
BLUESKY_IDENTIFIER, BLUESKY_APP_PASSWORDBluesky
REDDIT_CLIENT_ID, REDDIT_CLIENT_SECRETReddit app auth
REDDIT_USERNAME, REDDIT_PASSWORDReddit authenticated reads

On the hosted deployment, secrets live in ~/.config/reader/env (user-managed, mode 0600) and are loaded by the systemd unit. Rules worth keeping:

  • Never paste secret values into chat, tickets, or logs — reference them by name.
  • Tunnel credentials (~/.config/cloudflared/reader.json) stay outside every working tree and are never committed.
  • Provisioning that needs a Cloudflare API token runs from a workstation, never from the hosting box.

Two small localStorage stores belong to the web UI:

  • reader-column-layout-v1 — column widths and collapsed states.
  • reader-list-shortcuts-v1 — save-to-list keyboard bindings.

Both are per-device; clearing site data resets them.