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_PATHPath prefix Scryer itself serves for UI, GraphQL, health, OAuth, and WebSocket routes.unset, serves at /Any path prefix; normalized to /segment/…. Empty or whitespace serves at the root. A reverse proxy must preserve this prefix rather than strip it.
Network & HTTPSCRYER_PUBLIC_URLCanonical external origin advertised by OAuth metadata. Recommended behind a reverse proxy; it does not configure WebAuthn, routing, or the base path.Derived from one exact X-Forwarded-Proto value (or http when absent) and HostAbsolute http or https URL with a host and no credentials. Only the origin is used; any path is discarded. An invalid 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. Does not provision a password by itself.unset, uses the saved database setting unless bootstrap forces authenticationBoolean tokens: 1/true/yes/y/on, 0/false/no/n/off. Unrecognized values are treated as unset outside bootstrap; active bootstrap rejects invalid values and explicit false.
Auth & SecuritySCRYER_ADMIN_USERNAMESelects the local full administrator to provision or explicitly reset.adminTrimmed, nonblank username; reserved identities such as anonymous and recovery-admin are rejected. Without a supplied password, must identify an existing usable local full administrator. Does not promote, reenable, or convert existing accounts.
Auth & SecuritySCRYER_ADMIN_PASSWORDOperator-supplied temporary password for a new or eligible passwordless administrator. First login requires a different password. Existing passwords are preserved unless reset is enabled.unsetNonempty, policy-valid password; whitespace is preserved. Set-but-empty stops startup. Lower precedence than SCRYER_ADMIN_PASSWORD_FILE.
Auth & SecuritySCRYER_ADMIN_PASSWORD_FILEReads the temporary administrator password from a secret file. Takes precedence over the direct value.unsetReadable file containing a nonempty password. Trailing CR/LF characters are stripped; other whitespace is preserved. Empty paths, unreadable files, and empty secrets stop startup.
Auth & SecuritySCRYER_ADMIN_PASSWORD_RESETReplaces the selected account’s password with the supplied temporary password on every startup, invalidates sessions, and requires replacement again. Preserves MFA. Remove after use.falseBoolean tokens: 1/true/yes/y/on, 0/false/no/n/off. Blank or invalid values stop startup. True requires a password or secret file.
Auth & SecuritySCRYER_DISABLE_DEFAULT_ADMINDisables built-in admin and prevents reenabling it while configured. Removing the flag does not automatically reenable it.falseSame boolean tokens as reset; blank or invalid values stop startup. Requires another enabled local full administrator with a usable password on every boot. Cannot select admin for bootstrap/reset while disabling it.
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_TRUSTED_PROXY_IPSReverse-proxy addresses authorized to supply X-Forwarded-For for rate-limit client identity. This affects rate limiting only.unset, no proxies trustedComma-separated exact IPv4/IPv6 addresses or CIDRs. Invalid entries are ignored with a warning. Configure every controlled proxy hop and prefer a dedicated, narrow Docker network CIDR; broad LAN or shared container ranges weaken the trust boundary.
Rate LimitingSCRYER_RATE_LIMIT_BYPASS_IPSResolved clients exempt from all rate limiting.unset, empty listComma-separated IPs or CIDRs. Behind a configured trusted proxy, this is checked against the securely resolved client, not the proxy. 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.

For first-time boot password configurations, active bootstrap settings force authentication and disable local-IP bypass. Conflicting authless or recovery-admin configuration stops startup. Ordinary restarts do not reset an existing password unless SCRYER_ADMIN_PASSWORD_RESET=true.

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