Skip to content

Configuration

You can configure Scryer with environment variables for network binding, datastore selection, authentication, encryption, rate limiting, background workers, library paths, and container runtime behavior.

Use this page as the deployment-time reference. Prefer in-app settings for ordinary day-to-day operation; use environment variables when a setting must be known before startup, belongs to the host or container, or needs to be managed by your service manager.

This page lists the variables intended for operators to set. Scryer reads a number of additional variables for test harnesses, profiling, build tooling, and development-only behavior — those are deliberately not documented here, because setting them on a live instance either does nothing or causes problems.

When possible, pull sensitive values — passwords, encryption keys, and database credentials — from your deployment’s secret-management path.

  • Docker — the environment: block in your compose file.
  • Homebrew$(brew --prefix)/etc/scryer/config.env, which the service wrapper sources on start. Any variable on this page can go there.
  • Native or systemd — your service unit’s environment, or the shell that launches Scryer.
Showing all configuration variables.
CategoryNameDescriptionDefaultAllowed values
Network & HTTPSCRYER_BINDAddress and port the HTTP server listens on.Native: 127.0.0.1:8080; Docker: 0.0.0.0:8080; Homebrew: 127.0.0.1:8686Valid socket address. An unparsable value stops startup.
Network & HTTPSCRYER_BASE_PATHReverse-proxy path prefix for UI, GraphQL, health, and WebSocket routes.unset, serves at /Any path prefix; normalized to /segment/…. Empty or whitespace serves at the root.
Network & HTTPSCRYER_PUBLIC_URLCanonical external URL used as the OAuth issuer origin. Useful behind reverse proxies.Derived from X-Forwarded-Proto and HostAbsolute http or https URL. An unparsable value returns HTTP 400 on OAuth metadata requests.
Network & HTTPSCRYER_TLS_CERTPEM certificate chain path. Enables HTTPS. Must be set with SCRYER_TLS_KEY.unset, plain HTTPFile path. A load failure stops startup.
Network & HTTPSCRYER_TLS_KEYPEM private key path. Must be set with SCRYER_TLS_CERT.unsetFile path. A load failure stops startup.
Network & HTTPSCRYER_OPEN_BROWSEROpt out of auto-opening a browser on native startup. No effect in Docker.unset, opens on native installs0, false, no, off disable. Other values do not.
Network & HTTPSCRYER_OUTBOUND_HOST_RPSRequest-per-second ceiling for each public outbound host, such as indexers and metadata providers. Lower it if an indexer is throttling you.20 requests/second, burst 20Positive finite number. Private and local hosts stay pinned at 10/second and are unaffected; loopback is never throttled.
DatastoreSCRYER_DB_URLFull datastore URL. Takes precedence over SCRYER_DB_PATH.sqlite://<data-dir>/scryer.dbsqlite://, postgres://, postgresql://. PostgreSQL URLs must include a host, a database name, and an explicit sslmode of disable, prefer, require, verify-ca, or verify-full.
DatastoreSCRYER_DB_PATHSQLite database path. Ignored when SCRYER_DB_URL is set.Native: <data-dir>/scryer.db; Docker: /config/scryer.dbFile path or SQLite URL.
DatastoreSCRYER_DB_USERPostgreSQL username. Overrides any username in the URL.unset, falls back to the URL usernameNon-empty string. Startup fails if neither this nor a URL username is present.
DatastoreSCRYER_DB_PASSWORDPostgreSQL password. Lower precedence than SCRYER_DB_PASSWORD_FILE.unset, falls back to the URL passwordNon-empty string. Whitespace is not trimmed, so trailing spaces in a compose file will break authentication.
DatastoreSCRYER_DB_PASSWORD_FILEFile containing the PostgreSQL password, for Docker secrets. Takes precedence over SCRYER_DB_PASSWORD.unsetPath to a readable non-empty file. An unreadable or empty file stops startup.
DatastoreSCRYER_SQLITE_MAX_CONNECTIONSSQLite connection pool size.16Positive integer, clamped to 1..64. Unparsable values use the default.
DatastoreSCRYER_POSTGRES_MAX_CONNECTIONSPostgreSQL connection pool size.16Positive integer, clamped to 1..128. Unparsable values use the default.
Auth & SecuritySCRYER_AUTH_ENABLEDForces form login on or off, overriding the saved setting.unset, uses the saved database settingBoolean tokens: 1/true/yes/y/on, 0/false/no/n/off. Unrecognized values are treated as unset.
Auth & SecuritySCRYER_RECOVERY_ADMIN_PASSWORDEmergency admin password to regain access after a lockout. Forces form login on.unsetNon-empty password. Set-but-empty stops startup. Cannot be combined with SCRYER_ALLOW_UNAUTHENTICATED_PUBLIC_ACCESS=true.
Auth & SecuritySCRYER_ALLOW_UNAUTHENTICATED_PUBLIC_ACCESSLets unauthenticated public clients act as admin when auth is disabled. Dangerous.unset, disabledBoolean tokens; only a true value enables. Logs a warning while active.
Auth & SecuritySCRYER_UNAUTHENTICATED_PUBLIC_ACCESS_ALLOWLISTNarrows unauthenticated public access to specific clients.unsetComma-separated IPs, CIDRs, or DNS hostnames. Setting it with no valid entries stops startup.
Auth & SecuritySCRYER_ENCRYPTION_KEYMaster key encrypting stored secrets such as passwords and API keys.Platform keystore, otherwise a generated persistent keyBase64 32-byte key from scryer —generate-key. Invalid base64 stops startup.
Auth & SecuritySCRYER_JWT_ACCESS_TTL_SECONDSAccess-token lifetime, which controls how long a session lasts.86400 (24 hours)Positive integer seconds. Other values use the default.
Auth & SecuritySCRYER_WEBAUTHN_RP_IDWebAuthn relying-party ID, a bare hostname. Required for passkeys.unset, passkeys disabledNon-empty hostname. Must be set together with SCRYER_WEBAUTHN_RP_ORIGIN or passkeys stay disabled.
Auth & SecuritySCRYER_WEBAUTHN_RP_ORIGINWebAuthn relying-party origin, including scheme, host, and port.unset, passkeys disabledValid URL. An invalid value disables passkeys with a warning.
Auth & SecuritySCRYER_WEBAUTHN_RP_NAMEDisplay name shown in the passkey prompt.ScryerNon-empty string.
Rate LimitingSCRYER_RATE_LIMIT_BYPASS_IPSClients exempt from all rate limiting.unset, empty listComma-separated IPs or CIDRs. Invalid entries are silently dropped.
Rate LimitingSCRYER_LOGIN_RATE_LIMIT_ATTEMPTSLogin attempts allowed per window.5Positive integer; minimum 1.
Rate LimitingSCRYER_LOGIN_RATE_LIMIT_WINDOW_SECSLogin rate-limit window.60Positive integer seconds; minimum 1.
Rate LimitingSCRYER_SEARCH_RATE_LIMIT_REQUESTSExpensive search requests allowed per window.30Positive integer; minimum 1.
Rate LimitingSCRYER_SEARCH_RATE_LIMIT_WINDOW_SECSSearch rate-limit window.60Positive integer seconds; minimum 1.
Rate LimitingSCRYER_MUTATION_RATE_LIMIT_REQUESTSGraphQL mutations allowed per window.120Positive integer; minimum 1.
Rate LimitingSCRYER_MUTATION_RATE_LIMIT_WINDOW_SECSMutation rate-limit window.60Positive integer seconds; minimum 1.
Rate LimitingSCRYER_API_RATE_LIMIT_REQUESTSGeneral API and GraphQL query requests allowed per window.300Positive integer; minimum 1.
Rate LimitingSCRYER_API_RATE_LIMIT_WINDOW_SECSAPI rate-limit window.60Positive integer seconds; minimum 1.
Rate LimitingSCRYER_AUTHLESS_CLIENT_RATE_LIMIT_REQUESTSRequests per window for unauthenticated web clients.120Positive integer; minimum 1.
Rate LimitingSCRYER_AUTHLESS_CLIENT_RATE_LIMIT_WINDOW_SECSAuthless-client rate-limit window.60Positive integer seconds; minimum 1.
Rate LimitingSCRYER_OAUTH_RATE_LIMIT_REQUESTSOAuth endpoint requests allowed per window.30Positive integer; minimum 1.
Rate LimitingSCRYER_OAUTH_RATE_LIMIT_WINDOW_SECSOAuth rate-limit window.60Positive integer seconds; minimum 1.
Background JobsSCRYER_BACKGROUND_ACQUISITIONKill switch for the background acquisition poller.unset, enabledfalse, 0, no, off disable. Every other value enables.
Background JobsSCRYER_BACKGROUND_LIBRARY_REFRESHKill switch for scheduled background library refresh jobs.unset, enabledfalse, 0, no, off disable. Every other value enables.
Library & ImportsSCRYER_MANUAL_IMPORT_ALLOWED_ROOTSExtra filesystem roots that path-based manual import may read from.unset, empty listComma-separated absolute paths. Entries that are inaccessible, not a directory, or a filesystem root are dropped with a warning.
Library & ImportsSCRYER_MOVIES_PATHSeeds the movies library root on startup./data/moviesNon-empty path. Stops taking effect once the path is changed in the UI.
Library & ImportsSCRYER_SERIES_PATHSeeds the series library root on startup./data/seriesNon-empty path. Stops taking effect once the path is changed in the UI.
Library & ImportsSCRYER_ANIME_PATHSeeds the anime library root on startup./data/animeNon-empty path. Stops taking effect once the path is changed in the UI.
Logging & MetricsRUST_LOGLog verbosity and per-module filtering.infoRust tracing filter, e.g. info or info,scryer_application=debug. An invalid filter falls back to info.
Logging & MetricsSCRYER_LOG_FILEWrites logs to a file in addition to the console and the in-app log view.Linux and macOS: unset, no file. Windows: %LOCALAPPDATA%\scryer\logs\scryer.logFile path; relative paths resolve under the data directory. If set explicitly and the file cannot be opened, startup fails.
Logging & MetricsSCRYER_METRICSEnables the Prometheus metrics endpoint at /metrics.unset, disabledExactly 1 or true. Whitespace is not trimmed, and yes or on will not work here.
Container RuntimePUIDUser ID the container drops to. /config is chowned to it.1000Unsigned integer UID. Invalid values warn and fall back to 1000.
Container RuntimePGIDGroup ID the container drops to.1000Unsigned integer GID. Invalid values warn and fall back to 1000.
Container RuntimeUMASKFile-creation mask applied before dropping privileges. Docker only.022 in the Docker image; no mask applied elsewhereOctal mode, e.g. 022. Invalid values warn and are ignored.
Container RuntimeTZContainer timezone, which affects log timestamps and schedule evaluation.Etc/UTCAny tzdata zone name, e.g. America/New_York.

Scryer does not use one boolean syntax everywhere, so copy the accepted values from the row you’re setting rather than assuming.

  • Most settings accept 1/true/yes/y/on and 0/false/no/n/off.
  • The background job kill switches only recognize false, 0, no, and off as “off” — any other value, including a typo, leaves the job enabled.
  • SCRYER_METRICS accepts only 1 or true, and does not tolerate surrounding whitespace.
  • Docker — common place to set container environment variables
  • Homebrew — uses $(brew --prefix)/etc/scryer/config.env for service environment overrides
  • Recover Locked Out Scryer — uses SCRYER_RECOVERY_ADMIN_PASSWORD
  • Security — in-app controls for authentication once Scryer is running