A privacy-first metasearch engine β one query, many engines, zero logging.
null aggregates results across independent search engines (DuckDuckGo,
Marginalia, and Mwmbl), optionally Google through its official API,
merges
and ranks them, and forgets your query the moment you get your results.
- No query logging β queries and IPs are never persisted.
- No tracking cookies β an in-memory cache of shared results, never your identity.
- Instant answers & knowledge panel β math, unit/currency conversion, weather, dictionary and time answers, plus a Wikipedia/Wikidata-powered entity panel.
- Web, images and videos β image search fans out over Wikimedia Commons, Openverse and the Met Museum; video search over DuckDuckGo.
- Transparent comparisons β
/compare-privacyputs our own privacy claims in the same table as Google, Bing, DuckDuckGo, Startpage, Brave, and SearXNG. - Auditable & open β AGPL-3.0, buildable from source, self-hostable.
Browser ββΆ nginx (static SPA) ββΆ FastAPI /api ββΆ engines (async fan-out)
βββββββββββββΆ /r?url= redirect proxy (strips tracking)
| Layer | Tech | Responsibilities |
|---|---|---|
| Frontend | React 18 + Vite + Tailwind CSS | Home, results, /compare-privacy, settings, dark mode |
| Backend | FastAPI (Python) + httpx (async) | Aggregation, dedupe/rank, cache, rate limit, redirect proxy |
| Engines | Pluggable adapters | Web: DuckDuckGo, Marginalia, Mwmbl, Google (official API) Β· Images: Wikimedia Commons, Openverse, Met Museum, Pexels (key) Β· Videos: DuckDuckGo |
| Infra | Vercel, Docker Compose, nginx | Zero-config Vercel deploy, one-command self-hosted, CI-ready Dockerfiles |
# One-command deploy (assumes Vercel CLI is installed: npm i -g vercel)
vercel --prod
# Or: connect your Git repo at vercel.com/new β zero config.
# Set NULL_ENABLED_ENGINES in the Vercel dashboard β Settings β Environment Variables.Vercel's FastAPI preset detects the pyproject.toml entrypoint automatically:
the React SPA is built into public/ and served from the edge CDN, while the
FastAPI function handles all /api/* routes as a single serverless function.
| Vercel component | What it runs |
|---|---|
| Edge CDN | public/ (SPA shell, hashed JS/CSS) |
| Serverless function | backend/app/main.py β FastAPI on Python 3.12/3.13/3.14 |
Rewrites (vercel.json) |
Client routes (/search, /compare-privacy, β¦) β index.html |
Vercel serverless notes: in-memory caching and token-bucket rate limiting reset on cold starts β this is a feature, not a bug: there's nothing to leak.
cp .env.example .env
docker compose up --build
# Open http://localhost:8080# Backend
cd backend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# Frontend (new terminal)
cd frontend
npm install
npm run dev # http://localhost:5173 (proxies /api to :8000)All knobs are environment variables with sensible, privacy-first defaults β
see docs/CONFIG.md and .env.example.
Key ones:
| Variable | Purpose |
|---|---|
NULL_GOOGLE_CSE_KEY / NULL_GOOGLE_CSE_ID |
Official Google Custom Search JSON API (100 free queries/day) β set these to enable Google results |
NULL_TOR_PROXY |
SOCKS5 proxy (Tor) for captcha-gated engines (currently none) |
NULL_ENABLED_ENGINES |
Comma-separated engine list |
NULL_PEXELS_API_KEY |
Optional β activates the Pexels image engine (free key at pexels.com/api) |
NULL_ANALYTICS_ENABLED |
Aggregate counters only (never queries) |
NULL_ALLOW_HTML_SCRAPE_ENGINES |
Disabled by default; respects provider ToS |
Summary (full details in docs/API.md):
GET /api/search?q=β¦&category=β¦&language=β aggregated resultsGET /api/autocomplete?q=β¦β suggestions, never loggedGET /api/compare-privacyβ JSON behind the comparison pageGET /api/analytics/snapshotβ aggregate counters onlyGET /api/healthz,/api/enginesβ health and engine roster
- Queries are kept in memory for the duration of one request only.
- Rate limiting remembers buckets, not identities.
- Redirects (
/r?url=β¦) prevent referrer leakage to result sites. - Tracking parameters (
utm_*,gclid,fbclid, β¦) are stripped. - HTTPS is enforced in the nginx config; TLS terminates at your reverse proxy.
See frontend/src/pages/Privacy.tsx and the
privacy policy page for the full, auditable policy.
Licensed AGPL-3.0 (LICENSE). This project is inspired by and
extends the architecture of SearXNG (AGPL-3.0) β see NOTICE for
attribution. null is an independent codebase; no SearXNG source file is
copied. Running a public instance carries the AGPL Β§13 obligation to offer
source to your users.
- Engine registry + aggregation + dedupe/rank
- Home, results, compare-privacy, about/privacy/faq/contact/settings
- Docker Compose, CI, AGPL compliance
- Knowledge panel (Wikipedia + Wikidata, 30-day cache) and instant answers (math, units, currency, weather, dictionary, time)
- PostgreSQL analytics sink (aggregate only)
- Browser extension (
null://protocol handler) - Per-user preference sync (self-hosted)