Configuration#

Seurch is configured entirely through environment variables (in production) or a .env file (in development). The repository ships an .env.example documenting every variable; this page is the reference.

Core#

VariablePurposeNotes
SECRET_KEYDjango secret keyRequired in production. Long and random.
DEBUGDebug modeKeep False (the default) in production.
ALLOWED_HOSTSComma-separated hostnames the app will servee.g. search.example.com.
DATABASE_URLPostgreSQL connection URLe.g. postgres://user:pass@host:5432/seurch.
LOG_LEVELLogging verbosityDEBUG / INFO / WARNING / ERROR (default INFO).
LOG_SEARCH_QUERIESLog the raw query textDefaults to DEBUG, so off in production. Queries are personal data and container logs are retained; with it off, every provider log line carries only the query’s length.

Search providers#

These keys decide which engines, media tabs and knowledge cards are available. A provider with no key is simply hidden (not shown as broken). Full details on Search providers.

VariableEnables
BRAVE_API_KEYWeb, Images, News and Videos via Brave (the baseline).
BRAVE_SUGGEST_API_KEYAutocomplete suggestions (a separate Brave subscription).
MOJEEK_API_KEYThe Mojeek web engine.
MARGINALIA_API_KEYThe Marginalia web engine (public works out of the box).
STAAN_API_KEYThe Staan web engine (European index, web results only).
THETVDB_API_KEYThe film / TV knowledge card (TheTVDB v4).
THETVDB_PINSubscriber PIN, only for a user-supported TheTVDB key.
TRIPADVISOR_API_KEYThe places knowledge card.
STACKEXCHANGE_API_KEYA higher Stack Exchange quota for the Q&A card (optional).
PIXABAY_API_KEYPixabay images blended into the Images tab.
WORLDNEWS_API_KEYWorld News API articles blended into the News tab.

The “Paid” badge#

PAID_PROVIDERS decides which providers Settings → Engines marks with a Paid badge, so a user can see which ones are metered commercial APIs before switching them on. Leave it unset to use the app’s own list (Brave, Mojeek, Staan, World News); set it as a comma-separated list of provider keys when your deployment is on different plans:

PAID_PROVIDERS=brave,mojeek,staan,worldnews

Names that aren’t provider keys are ignored, so PAID_PROVIDERS=none badges nothing. The badge is a label only, it never changes what a user may enable.

Translation#

VariablePurpose
LIBRETRANSLATE_URLURL of your LibreTranslate instance. Unset disables the Translate tab entirely.
LIBRETRANSLATE_API_KEYOnly if your LibreTranslate requires a key (LT_API_KEYS=true).
LIBRETRANSLATE_ORIGIN_COUNTRYTwo-letter country code for the flag shown next to “Translate” in Settings (default fr).

See Translation.

Provider status and monitoring#

Whether this instance publishes provider health, and what an external uptime monitor can poll. Full details on Monitoring.

VariablePurposeDefault
STATUS_PAGE_ENABLEDPublish the /status page, and the API’s status/ endpoint that serves the same data. Turn it off to keep which providers you use, and when they fail, to yourself.true
STATUS_MONITOR_ENABLEDServe /status/health and /status/health/<provider>, the 200-or-500 endpoints an uptime monitor polls.true
STATUS_MONITOR_TOKENShared secret required by those endpoints (?token=, X-Monitor-Token, or Authorization: Bearer).(empty, open)
STATUS_MONITOR_PROVIDERSWhich providers the /status/health roll-up watches: provider slugs and/or the group keys engine, media, cards, instant, maps, translate.(empty, every configured provider)

The two are independent: monitoring keeps working with the page turned off, which is the point, an instance that doesn’t publish the page still needs to be monitorable.

STATUS_PAGE_ENABLED=false
STATUS_MONITOR_PROVIDERS=engine
STATUS_MONITOR_TOKEN=a-long-random-string

Public API rate limits#

Applied per API key (Django REST Framework throttle rates, <number>/<period>, where period is second / minute / hour / day). Both limits apply together. See the API rate limits page.

VariablePurposeDefault
API_THROTTLE_BURSTShort-term cap, shields upstream providers from a runaway client60/min
API_THROTTLE_SUSTAINEDDaily volume cap5000/day

Email (password reset)#

Used only to send password-reset messages, see Users & access.

VariablePurpose
EMAIL_BACKENDDjango email backend (SMTP, console, …).
EMAIL_HOST / EMAIL_PORTSMTP server.
EMAIL_USE_TLSTrue / False.
EMAIL_HOST_USER / EMAIL_HOST_PASSWORDSMTP credentials.
DEFAULT_FROM_EMAILThe “From” address on outgoing mail.

For a quick test without a real SMTP server, set EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend to print emails to the container log.

The footer ships no privacy policy, terms or legal notice by default, that content is specific to whoever operates the instance and your jurisdiction. Add your own as Label=URL pairs separated by commas:

FOOTER_LINKS=Privacy=https://example.com/privacy,Legal notice=https://example.com/legal

Leave FOOTER_LINKS unset to show no extra footer links.

VariablePurpose
SOURCE_URLRepository linked from the footer’s Source link. Point it at your own fork if you run a modified version.
GIT_REFGit branch or tag shown next to the copyright in the footer.
GIT_SHACommit hash shown next to the copyright, so a deployment can be traced back to the exact build.

The Docker image sets GIT_REF and GIT_SHA automatically at build time, only set them by hand for other deployment methods.