Seurch is a privacy-first metasearch engine built with Django 6. It blends several independent web indexes, behind one clean interface, alongside Images, News, Videos, Maps and Translate tabs and instant answers. Seurch as a service is in alpha and available only to authenticated users (invite-only) at this time.
Usefull links:
- Web search across four engines, Brave, Mojeek, Marginalia and Staan.
- Search scope, a quick per-search provider picker on the results page, on every tab that blends providers.
- Images, News and Videos via the Brave Search API, each with an extra provider blended in, Pixabay (Images), the World News API (News) and Sepia/PeerTube (Videos).
- Maps via OpenStreetMap (Nominatim geocoding + an embedded map).
- Translate tab powered by LibreTranslate.
- Knowledge panel beside the web results, Wikipedia, TheTVDB (film/TV), TripAdvisor (places) and Stack Exchange cards.
- Instant answers above the results, weather, currency & unit conversion, a calculator, colour/base converters, QR codes, world clock, regex/JSON tools, hashes & UUIDs, HTTP status & port lookups, dice/coin/random, timer, and more (most computed locally; see Instant answers).
- Bangs, start a query with
!to send it straight to another site,!wWikipedia,!ghGitHub,!ytYouTube, over 13,000 shortcuts from the community list, plus tab bangs (!images,!n,!maps, …) that switch tab without leaving Seurch and a lucky!that jumps to the first result. - Custom bangs, define your own trigger and URL template under Settings → Custom bangs; they override a built-in shortcut of the same name and sync across your devices.
- Public JSON API - every search feature (web, images, news, videos, maps, translate, instant answers, knowledge cards, suggestions, provider status) is available programmatically over a Django REST Framework API, authenticated with per-user API keys and rate-limited per key.
- Dark/light/system theme; UI translated into seven languages.
- Optional account email, used only for password reset (without one, a lost password is unrecoverable).
- Python 3.13+
- uv
- Podman with podman-compose
- A Brave Search API key (free tier available)
- Optional: keys for Mojeek, Marginalia (
publicworks out of the box), Staan, TheTVDB, TripAdvisor, Stack Exchange, Pixabay and the World News API, each enables an extra engine or data source (see.env.example) - Optional: Node.js 22+, only needed to edit the styles (the compiled CSS and icon assets are committed; see Frontend)
cp .env.example .envThe defaults in .env.example match the credentials used by the Podman Compose
PostgreSQL service, so no changes are needed for local development. Add your API
keys to .env, at minimum a Brave key for results:
BRAVE_API_KEY=your_brave_key_here
BRAVE_SUGGEST_API_KEY=your_brave_suggest_key_here # autocomplete (separate Brave subscription)
MOJEEK_API_KEY=your_mojeek_key_here # optional
MARGINALIA_API_KEY=public # optional; "public" = free shared key
STAAN_API_KEY=your_staan_key_here # optional
.env.example documents every supported variable, including the optional
knowledge-card / media providers (THETVDB_API_KEY, TRIPADVISOR_API_KEY,
STACKEXCHANGE_API_KEY, PIXABAY_API_KEY, WORLDNEWS_API_KEY), the
LibreTranslate connection (LIBRETRANSLATE_URL) and the mail settings.
Marginalia's public API needs no signup, the literal value public is the free
shared key (rate-limited to ~1 req / 5 s). Without keys the app still runs, but
the affected tabs/cards display a configuration notice instead of results.
make setupThis single command installs dependencies, enables the repo's git hooks, starts the dev services, applies migrations and compiles the translation catalogs.
Or run each step manually:
make sync # install Python dependencies
make hooks # enable the git hooks (commit-message check)
make up # start the dev services (PostgreSQL + Mailpit + LibreTranslate)
make migrate # apply migrations
make run # start the dev serverThe app is then available at http://localhost:8000.
The UI is styled with Tailwind CSS v4 (CSS-first config, no
tailwind.config.js) and uses self-hosted Font Awesome Free icons (no CDN).
Both build outputs are committed, so the app and the Docker image need no
Node at runtime, Node is only required to change styles or icons.
| Path | Role |
|---|---|
assets/app.css |
Source → compiles to search/static/search/tailwind.css (global stylesheet). |
assets/instant.css |
Source → compiles to instant/static/instant/instant.css (instant-answer cards). |
search/static/search/vendor/fontawesome/ |
Vendored Font Awesome CSS + webfont (never edited by hand). |
scripts/copy-fontawesome.mjs |
Copies Font Awesome from node_modules into static (make fonts). |
make css-install # one-off: install the toolchain (npm ci)
make css # compile assets/*.css → the committed stylesheets
make css-watch # rebuild on every save while developingAfter editing any template class or a source .css, run make css and
commit the regenerated output. CI has a dedicated css job that rebuilds from
source and fails if the committed CSS is stale, so it can never drift.
Bug reports and pull requests are welcome. CONTRIBUTING.md
covers the dev setup, the three CI gates to run before opening a pull request
(ruff check, make test, make css), the Conventional Commit format the
commits job enforces, and what review looks for. Everyone taking part is
expected to follow the Code of Conduct.
Report security problems privately through GitHub security advisories rather than as a public issue.
Seurch is a metasearch engine: almost nothing it shows is its own. It stands on the indexes, open data and free software below, and is grateful to all of them.
Search & data providers
- Brave Search API, the primary index, and the source for the Images, News and Videos tabs.
- Mojeek, an independent UK web index with a crawler of its own.
- Marginalia Search, a non-commercial index for the small, non-commercial web.
- Staan / European Search Perspective, the European index built by Qwant and Ecosia's joint venture.
- Pixabay, World News API and Sepia (the PeerTube search index), the supplementary Images, News and Videos providers.
- OpenStreetMap contributors and Nominatim, the Maps tab and the map quick answer. © OpenStreetMap contributors, data under ODbL.
- LibreTranslate, the self-hosted engine behind the Translate tab.
- Wikipedia and Wikidata, knowledge-card detection and content, under CC BY-SA.
- TheTVDB, Tripadvisor and Stack Exchange, the film/TV, places and Q&A knowledge cards.
- Open-Meteo, weather instant answers, and Frankfurter, exchange rates from European Central Bank data, both free and keyless.
- kagisearch/bangs, the community bang
list Kagi maintains in the open, which is what
make bangsfetches and what every external bang resolves through.
Each provider's API terms apply to the results they return; Seurch's own licence does not extend to them.
Built with
- Django and Django REST Framework, the application and the public API.
- httpx for every upstream call, psycopg for PostgreSQL, django-environ for configuration.
- Gunicorn and WhiteNoise, serving the app and its static files in the container.
- lingua for language detection and segno for QR-code instant answers.
- Tailwind CSS and Font Awesome Free, the interface, self-hosted, no CDN.
- uv, Ruff, Commitizen, Podman, PostgreSQL and Mailpit, the development toolchain.
And to DuckDuckGo, whose bangs and instant answers are the obvious inspiration for two of the features above.
Seurch is free software, licensed under the GNU Affero General Public License v3.0 only (AGPL-3.0-only). The full text is in LICENSE.
This covers Seurch's own code. The upstream search APIs it queries, and the
vendored third-party assets under search/static/search/vendor/ (Font Awesome
Free, which is CC BY 4.0 / SIL OFL 1.1 / MIT depending on the part), carry their
own terms.