# Backend settings DATABASE_URL=sqlite:///./data/librislog.db GOOGLE_BOOKS_API_KEY= # optional — see https://codebude.github.io/librislog/guide/api-keys CORS_ORIGINS=["http://localhost", "http://localhost:5173"] LOG_LEVEL=INFO # DEBUG | INFO | WARNING | ERROR | CRITICAL COVERS_DIR=./data/covers # Directory where downloaded cover images are stored locally. # Generate a real secret: openssl rand -base64 32 API_KEY_ENCRYPTION_KEY=CHANGE_ME_TO_32PLUS_CHARS # <-- YOU MUST CHANGE THIS AUTH_COOKIE_NAME=librislog_session AUTH_COOKIE_SECURE=false # set true in production (HTTPS) AUTH_COOKIE_SAMESITE=lax # lax | strict | none AUTH_COOKIE_DOMAIN= # optional, e.g. app.example.com # Optional OIDC settings (leave OIDC_ENABLED=false to disable) OIDC_ENABLED=false OIDC_PROVIDER_ID=oidc OIDC_PROVIDER_NAME=Single Sign-On OIDC_CLIENT_ID= OIDC_CLIENT_SECRET= OIDC_WELL_KNOWN_URL= OIDC_SCOPE="openid email profile" # Dashboard quote settings DASHBOARD_QUOTE_ENABLED=true DASHBOARD_QUOTE_URL="https://motivational-spark-api.vercel.app/api/quotes/random" DASHBOARD_QUOTE_CACHE_TTL=86400 # in seconds; default 24h # Frontend settings (build-time) PUBLIC_DEFAULT_LOCALE=en # UI default locale: en | de # Book import search providers # At least one source must be able to answer. If every source below is disabled, the # backend refuses to start and names the variables in the error. OPEN_LIBRARY_IMPORT_SEARCH_ENABLED=true # BnF (Bibliotheque nationale de France) - no API key needed, HTTPS BNF_IMPORT_SEARCH_ENABLED=true # Inventaire.io - no API key needed, HTTPS, ISBN searches only INVENTAIRE_IMPORT_SEARCH_ENABLED=true # Hardcover and Google Books need credentials before they can answer anything, so they # are set to false here. The built-in default is true so that upgrading never silently # drops a source; set either to true once its key or token is configured: # HARDCOVER_APP_API_TOKEN (see https://codebude.github.io/librislog/guide/api-keys) # GOOGLE_BOOKS_API_KEY # A source left enabled without its key makes no request and is reported as skipped, # so leaving the default is harmless, just noisier in the search progress list. # Setting GOOGLE_BOOKS_IMPORT_SEARCH_ENABLED=false also disables the on-demand # "Search Google Books too" button. HARDCOVER_IMPORT_SEARCH_ENABLED=false GOOGLE_BOOKS_IMPORT_SEARCH_ENABLED=false # Library of Congress - no API key needed # WARNING: This source is reached over PLAIN HTTP (unencrypted) on port 210; the LC # offers no HTTPS for its SRU endpoint. Book queries and responses travel unencrypted # and can be observed or tampered with on the network path. Only public bibliographic # data is transferred. Set this to false if unencrypted egress to port 210 is not # acceptable in your environment. All other sources use HTTPS. LIBRARY_OF_CONGRESS_IMPORT_SEARCH_ENABLED=false # Deutsche Nationalbibliothek (German National Library) - no API key needed, HTTPS DNB_IMPORT_SEARCH_ENABLED=true # Cover scraper settings THALIA_COVER_SEARCH_ENABLED=false # For research only. Do not use in production without understanding the legal implications of scraping. # TLS / reverse proxy settings # Forwarded headers are trusted only from matching IPs. "*" trusts all proxies. FORWARDED_ALLOW_IPS=* # Password reset email settings (SMTP) # For local development, use Mailpit: mail_server=mailpit mail_port=1025 mail_username="" mail_password="" mail_starttls=False mail_ssl_tls=False # In docker-compose: mail_server=mailpit mail_port=1025 MAIL_SERVER= MAIL_PORT=587 MAIL_USERNAME= MAIL_PASSWORD= MAIL_FROM= MAIL_FROM_NAME=LibrisLog MAIL_STARTTLS=True MAIL_SSL_TLS=False PUBLIC_APP_URL=http://localhost:5173 PASSWORD_RESET_TOKEN_MAX_AGE=3600 # Anonymous installation telemetry (see docs: guide/telemetry) # Sends a minimal, anonymous installation census heartbeat (install id, version, os, architecture, runtime). # Set TELEMETRY_DISABLED=true to opt out completely. TELEMETRY_DISABLED=false TELEMETRY_ENDPOINT=https://metrics.librislog.app/api/telemetry TELEMETRY_TIMEOUT_SECONDS=10