Search Google, Bing, and DuckDuckGo at the same time in real Chrome windows, then merge the organic results into a clean, ad-free consensus view — with a local Ollama model summarizing the overlap and picking a best match.
The consensus pane is a small FastAPI app. You type once there; Playwright drives typed searches in the other three windows (so you stay in a normal browser session / profile instead of hitting raw search APIs).
┌─────────────┬─────────────┐
│ Google │ Bing │
├─────────────┼─────────────┤
│ DuckDuckGo │ Consensus │ ← FastAPI UI + Ollama summary
└─────────────┴─────────────┘
Comparing engines by hand means juggling tabs and ads. Multi Search Server:
- Opens four visible Chrome windows (2×2 on a big screen)
- Types your query into three engines like a person would
- Pulls organic results (and follows Next / More results once for more depth)
- Merges by URL / title overlap and ranks consensus hits
- Asks local Ollama (
gemma4:e4bby default) for a short summary + best match - Shows everything in a sticky-search-bar consensus UI (summary scrolls with results)
- Python 3.11+ (3.12 recommended)
- Google Chrome (or Chromium)
- A desktop session (headed Chrome — not pure SSH without a display)
- Ollama running locally, with a model pulled (default:
gemma4:e4b) - Optional: Rectangle (macOS) or
wmctrl/xdotool(Linux) for auto 2×2 tiling
git clone https://github.com/deneskelenyi/Multi-Search-Server.git
cd Multi-Search-Server
python3.12 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .System Chrome is used via Playwright’s channel=chrome — you do not need playwright install for Chromium unless you prefer it.
# Start Chrome + FastAPI consensus UI at http://127.0.0.1:8765
python -m search_consensus
# Optional initial query (auto-runs when the UI loads)
python -m search_consensus "best espresso machine under 200"
# Custom bind / Ollama
python -m search_consensus --host 127.0.0.1 --port 8765 \
--ollama-model gemma4:e4b --ollama-url http://127.0.0.1:11434
# Attach to Chrome already started with remote debugging
# chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.search-consensus-chrome"
python -m search_consensus --cdp http://127.0.0.1:9222
# Use a real Chrome profile (close Chrome first)
python -m search_consensus --profile Default
# Skip automatic window tiling
python -m search_consensus --no-tileType in the Consensus window search box. That POSTs to /api/search, which searches the other three windows, merges results, and refreshes the summary + list.
| Method | Path | Purpose |
|---|---|---|
GET |
/ |
Consensus UI (?q= optional initial query) |
GET |
/health |
Liveness / engine readiness |
POST |
/api/search |
Body: {"query": "..."} → consensus JSON + Ollama summary |
| Mode | Behavior |
|---|---|
| (default) | Dedicated profile under ~/.search-consensus-chrome |
--profile Default |
System Chrome Default profile (close Chrome first) |
--cdp URL |
Attach to an already-running Chrome with remote debugging |
Using your real profile helps avoid bot walls; engines can still show CAPTCHAs — leave the windows visible so you can solve them.
search_consensus/
app.py # Orchestrates Chrome windows + uvicorn
server.py # FastAPI routes
engines.py # Typed search + parsers + pagination
consensus.py # Merge / rank logic
ollama_client.py # Local LLM summary
ui.py # Consensus HTML/CSS/JS
chrome.py # Persistent profile / CDP launch
tiling.py # macOS / Linux 2×2 layout helpers
cli.py # `python -m search_consensus`
- Google Split View is only two panes; this project uses four windows instead.
- Page-size URL hints (
num=,count=) are best-effort; clicking Next once is the reliable way to deepen results. - Works on macOS and Linux with the same Python code.
Use and modify as you like for personal or experimental tooling. Respect each search engine’s terms of service.