Migration
Replace Google Search with your own metasearch
SearXNG removes the profiling and the ads without building a new index. That is the whole trade, and the operational problem is that upstream engines can see your instance is one machine.
Can you self-host a replacement for Google Search?
You can self-host SearXNG, which forwards your query to dozens of engines, merges the results and keeps no profile or history. It is a metasearch front end, not a search index: it has no crawler of its own, so it depends on the engines it queries continuing to answer it. The thing you lose is not privacy or speed, it is reliability of the result mix, because Google and several others detect a single server IP as automation and start refusing it. A private instance on a home connection works far better than one on a datacenter VPS, which inverts the usual self-hosting advice.
SearXNG has no crawler. It never has. Every result it shows you came from Google, Brave, DuckDuckGo, Mojeek, Wikipedia or whichever of the several dozen engines you left enabled in settings.yml. It sends your query out, merges what comes back, and forgets you.
That is worth saying first because most write-ups present it as an alternative search engine. It is not. It is a front door with the tracking removed, and its dependencies are the same companies you were trying to leave.
What you are actually giving up#
Reliability of the result mix. This is the real cost and it is operational, not philosophical. Upstream engines have got very good at recognizing a server IP behaving like a bot. Run a private instance on a VPS and the usual outcome is that Google returns nothing parseable within a few queries, Brave and Startpage suspend with too-many-requests or CAPTCHA errors, and DuckDuckGo and a handful of smaller engines keep working. Hosting address ranges are scored as automation regardless of how polite your headers or how slow your pace, so there is no configuration that fixes it.
The inversion matters: a residential IP behaves far better than a datacenter one. If you already put everything on a cheap VPS because that is the sane place for a service, this is the one thing you should run at home instead.
Personalization. Google knows where you are, what you searched last week and which of two identical restaurant names you meant. SearXNG knows nothing about you by design, so ambiguous, local and follow-up queries get measurably worse answers. "Plumber" returns plumbers, not plumbers near you. Some people find that clarifying and some find it exhausting.
Result quality on hard queries. Merging several engines is good for coverage and mediocre for ranking. You will find the thing, and you will scroll further to find it. Rich results, maps, flight status, unit conversion cards and the answer boxes people quietly rely on are mostly gone or come from a limited set of instant-answer sources.
A public instance is a different product. If you were thinking of running one for other people, understand that it concentrates many strangers' queries behind one address, gets blocked faster, and makes your IP the origin of whatever anyone searches. That is an abuse-handling job with real legal exposure, not a homelab service.
If any of that lands badly, stay on DuckDuckGo or pay for Kagi. When not to self-host is not a joke section.
What you get instead#
No profile is ever built, because there is nothing to build it in. SearXNG has no accounts, no login and no search history: your preferences live in your own cookie or in a settings URL you can paste into another browser. No ads and no ad auction shaping the first screen. Per-category engine selection, so you can decide that code questions go to Stack Exchange and Mojeek and never to a content farm. And a free JSON search endpoint for your own scripts, which pairs well with a local model from Replacing ChatGPT.
Get your data out first#
This is the one migration on the site where there is almost nothing to export, and that is itself the point: your search history is a product held on someone else's servers, not a dataset you own.
If you want it before you stop feeding it, Google Takeout will hand you My Activity as JSON or HTML. Skim it once. It is the most accurate description of your last five years that exists anywhere, and it is a better argument for this migration than anything on this page.
On the way out, the practical things to carry over are your browser's default search engine setting, any custom search keywords you have built up, and your bookmarks. If you have been using search as a memory substitute, that habit is what actually needs replacing: linkding or Karakeep for bookmarks, and FreshRSS for the sites you kept searching for by name.
Which one to pick#
There is one option in this category worth running, so the decision is not which software but which shape.
| Your situation | What to run | Why |
|---|---|---|
| One household, home internet, static or dynamic IP | Private instance on your LAN | Residential IP keeps most engines answering |
| Everything else you host is on a VPS | Still run this one at home | Datacenter ranges get blocked hardest |
| You need Google results dependably | Do not migrate | A single server IP is exactly what Google refuses |
| You want a free search API for scripts or agents | Private instance with json in search.formats | Never expose it publicly once JSON is on |
| You want it while travelling | Private instance plus WireGuard | See Remote access without port forwarding |
| You want to run it for strangers | Reconsider | Public mode is an abuse-handling commitment |
What it actually costs#
Not hardware, for once. Two containers, SearXNG itself and a Valkey or Redis instance that exists only to hold limiter counters. It idles around 150 MB and settles near 350 MB in use, more if you enable the image proxy, because proxied images pass through the uwsgi workers. Storage is effectively nothing: settings.yml is a few kilobytes and nothing accumulates because nothing is stored. Each search fans out to many engines in parallel and the work is mostly waiting on HTTP, so CPU stays low and your latency is the slowest engine's timeout.
The cost is your attention, roughly monthly, spent noticing that an engine has started blocking you and editing it out:
# settings.yml
server:
secret_key: "change-this-or-the-docs-will-shout-at-you"
base_url: "https://search.example.internal/"
method: "POST"
search:
formats:
- html
- json
engines:
- name: google
disabled: trueThree notes on that file. secret_key must not stay at its default; the documentation is explicit. base_url must be the exact public URL or generated links point at the wrong host. And method: POST keeps queries out of browser history at the cost of breaking the back button and drag-and-drop, which is a real usability trade rather than a free win.
Behind a reverse proxy, list your proxy in the trusted networks in limiter.toml, or every visitor appears to come from the proxy address, shares one rate-limit bucket, and the instance rate limits itself after a few searches. Reverse proxy and TLS covers the proxy side, and Caddy is the least-effort way to get TLS in front of it.
What breaks and how to tell early#
Week one: an engine quietly disappears. The page still loads and looks fine, with one fewer source in the mix. Open the preferences page and read the engine status table. That table is your monitoring for this service, and it is more useful than any uptime check, because the process never crashes.
A 429 you attribute to the wrong layer. If your browser gets a 429, that is your limiter. If the results page renders with sections missing or an engine marked suspended, that is upstream. Diagnose which before you touch limiter.toml, because the fixes have nothing in common.
The limiter without Valkey. Setting limiter: true with no reachable Valkey means the limiter cannot function at all. Check that both containers came up.
The household test. The honest early signal is not technical. It is whether anyone else in the house sets it as their default browser search and leaves it there for two weeks. If they silently switch back, the result quality gap is real for their queries even if it is not for yours.
The point of no return#
There isn't one, and that is unusual enough to say plainly. There is no index to build, no account to migrate, no data to lose. settings.yml and limiter.toml are the entire instance, they are a few kilobytes, and you keep them in git. A restore is docker compose up plus one file. Deleting the whole thing costs you the time it takes to change your browser's default search engine back.
The only irreversible act is on the other side: if you delete your Google account activity or turn off search history to stop the profiling, that history does not come back. Export first if you want it, then turn it off, and treat the SearXNG instance as reversible in a way almost nothing else on this site is.
What to do next#
Stand it up at home, not on a VPS, and run it as your browser default for two weeks before you form an opinion. Read the SearXNG profile for the deployment detail, put it behind Reverse proxy and TLS if it leaves the LAN, and if the point of all this is to stop sending queries to companies that keep them, Replacing ChatGPT is the other half of the same decision.
Questions#
Does SearXNG have its own search index?
No. There is no crawler and no index anywhere in the project. SearXNG takes your query, fans it out to the engines you have enabled, scrapes or calls their results, merges and reranks them, and shows you one page. Every result you see came from Google, Brave, DuckDuckGo, Wikipedia, Stack Exchange or whichever engines are enabled in settings.yml. That is why it can be private without being a smaller Google: it is a proxy with taste, not an alternative crawl of the web.
Why does my SearXNG instance say too many requests?
There are two completely different causes and people fix the wrong one for hours. A 429 shown to your browser is your own limiter deciding you look like a bot. An upstream engine refusing your server looks different: the results page loads normally with sections missing, or an engine shows as suspended. Check the engine status on the preferences page first. If it is upstream, no amount of limiter.toml tuning will help; if it is your limiter, check that your reverse proxy is listed in the trusted networks.
Can I get Google results from a self-hosted SearXNG?
Sometimes, and not dependably. Google is the engine that blocks single-IP instances fastest, and hosting address ranges are scored as automation regardless of how polite your headers or how slow your pacing. On a residential connection a household instance usually keeps Google answering for a long time. On a VPS the common outcome is nothing parseable back from Google within a handful of queries. If you specifically need Google results, this is the deciding fact, and a paid engine like Kagi is the honest alternative.
Should I run a public SearXNG instance?
Not casually. A public instance concentrates many strangers' queries behind your one address, which accelerates every blocking problem, and it makes your IP the origin of whatever anyone searches for. The project ships a public_instance mode that turns on bot detection and the image proxy for exactly this reason. If you are not prepared to handle abuse reports and legal correspondence, keep it private and put an auth proxy in front.
Can SearXNG be used as a search API for scripts or an AI agent?
Yes, once you add json to search.formats in settings.yml and restart, because only the HTML format is enabled by default. Be careful what you do next: enabling JSON and leaving the instance reachable from the internet publishes an open, unauthenticated search API that others will find and use through your IP, with the blocking consequences landing on you. Bind it to your LAN or a WireGuard interface.
What do I actually gain over DuckDuckGo?
No profile, no ad auction and no single company between you and the results. DuckDuckGo does not track you either, but it is one company's front end to one main index; SearXNG queries several engines at once and you choose which. You also gain per-category engine selection, bang-style shortcuts and a settings URL you can carry between browsers with no account. You lose personalization, which is a real quality loss for local and ambiguous queries.
Sources#
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.