KnockOutEZ/wigoloPublic

The go-to web for your AI coding agent — local-first search, fetch, crawl & research over MCP. No API keys, no cloud, $0/query. Public beta.

AI summary: Local-first web intelligence and search endpoint for AI agents.

Stars
4.4K
+202 today
Forks
307
Watchers
14
Open issues
26
Open PRs
18
Contributors
~11
Commits
2K
Branches
79

TypeScriptOtherCreated Apr 12, 2026Last push 1d agoLatest release v0.2.1+338 stars this week+563 this month

Star history

since Jul 28, 2026
02K4KJul 2026Jul 2026Aug 2026Aug 2026
4.4K stars as of Aug 7, 2026, tracked back to Jul 28, 2026.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulAugMonWedFri2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 1 commit2026-04-12: 118 commits2026-04-13: 46 commits2026-04-14: 56 commits2026-04-15: 86 commits2026-04-16: 103 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 33 commits2026-05-01: 43 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 30 commits2026-05-07: 2 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 5 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 7 commits2026-05-19: 25 commits2026-05-20: 35 commits2026-05-21: 43 commits2026-05-22: 5 commits2026-05-23: 2 commits2026-05-24: 59 commits2026-05-25: 75 commits2026-05-26: 86 commits2026-05-27: 39 commits2026-05-28: 28 commits2026-05-29: 24 commits2026-05-30: 12 commits2026-05-31: 34 commits2026-06-01: 17 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 21 commits2026-06-07: 1 commit2026-06-08: 29 commits2026-06-09: 3 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 1 commit2026-06-13: 41 commits2026-06-14: 29 commits2026-06-15: 7 commits2026-06-16: 1 commit2026-06-17: 1 commit2026-06-18: 1 commit2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 1 commit2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 24 commits2026-07-02: 3 commits2026-07-03: 0 commits2026-07-04: 61 commits2026-07-05: 14 commits2026-07-06: 5 commits2026-07-07: 0 commits2026-07-08: 1 commit2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 6 commits2026-07-13: 20 commits2026-07-14: 1 commit2026-07-15: 67 commits2026-07-16: 67 commits2026-07-17: 101 commits2026-07-18: 41 commits2026-07-19: 17 commits2026-07-20: 13 commits2026-07-21: 1 commit2026-07-22: 1 commit2026-07-23: 9 commits2026-07-24: 16 commits2026-07-25: 4 commits2026-07-26: 0 commits2026-07-27: 1 commit2026-07-28: 6 commits2026-07-29: 0 commits2026-07-30: 2 commits2026-07-31: 0 commits2026-08-01: 21 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits
1,652 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Breakout launch

    4,369 stars in 117 days

  • Rising fast

    +338 stars this week

  • Very active

    1,652 commits in 52 weeks

  • Well documented

    High community health score

  • Continuous integration

    Automated checks passing

  • Repeat trending

    4 trending appearances

What wigolo does

wigolo provides a comprehensive, local-first web intelligence surface designed specifically for AI agents. It acts as a unified Model Context Protocol (MCP) server or REST endpoint that grants agents capabilities like searching, fetching, crawling, extracting, and caching web data. Because it runs locally alongside the agent—whether it be Claude Code, Cursor, or a self-hosted LangChain setup—it requires no API keys, no cloud subscriptions, and zero metered billing.

AI developers, prompt engineers, and users of autonomous coding agents who need unrestricted, free web access for their LLMs. Requires basic terminal knowledge to start the server.

  • Local-First Architecture: Runs entirely on the user's hardware, eliminating the need for expensive third-party web search APIs.
  • Universal Compatibility: Integrates with major coding environments (Cursor, VS Code) and agent frameworks (LangChain, CrewAI).
  • Advanced Web Tools: Includes distinct tools for searching, crawling, extracting specific data, and finding similar content.
  • Zero Metered Billing: Avoids the per-request pricing models of standard search APIs, enabling autonomous gather loops.
  • MCP Server Support: Runs natively as an MCP server to easily attach to compatible LLM clients.

Where teams use it

Agentic Research Loops

Developers let their agent autonomously crawl documentation sites for hours to learn a new framework without incurring API costs.

Local Context Gathering

A coding agent uses wigolo via MCP to search StackOverflow for specific error messages and read the top answers.

Self-Hosted AI Pipelines

Data engineers deploy wigolo on their own servers to let their internal LangChain agents scrape competitor websites securely.

Cost-Free IDE Search

Cursor users connect the local endpoint to allow the editor to search the web for missing type definitions instantly.

Getting started: Run the server locally and point your agent/MCP client to the endpoint.

README

main branch
wigolo — the go-to web for your agent

Local-first web intelligence for AI agents — no keys, no cloud, no metered bill.

works with  Claude Code · Cursor · Codex · Gemini CLI · OpenCode · VS Code · Windsurf · Zed · Antigravity
and beyond  LangChain · CrewAI · LlamaIndex · Vercel AI SDK · n8n & self-hosted agents · any MCP client · plain REST

npm npm downloads GitHub stars CI node MCP license status follow on X

wigolo on Trendshift KnockOutEZ%2Fwigolo | Trendshift

Quickstart · Tools · Why wigolo · Benchmark · Docs · Examples · Feedback · FAQ

New features and updates ship steadily. Follow @yourtowhid on X for all of it and new ways to use wigolo, and reach out there for collaborations or feedback · also on LinkedIn


wigolo gives an AI agent one surface for everything web-related: search, fetch, crawl, extract, cache, find-similar, research, and autonomous gather loops. It runs wherever your agent runs — as an MCP server next to your coding agent, as a REST/MCP endpoint on the box where your self-hosted agents live, or embedded through an SDK inside your own app. The core tools need no API keys, nothing it touches leaves ~/.wigolo/, and no bill grows with how much your agent thinks.

wigolo demo — Claude Code answering a live web question through wigolo, no API keys

Quickstart

npx wigolo init                              # set up the local engine — any system
npx wigolo init --agents=claude-code,cursor  # …or set up + wire your day-to-day agents in one command

Requires Node ≥ 20 and ~1.5 GB of free disk on macOS, Linux, or Windows. Bare init sets up the local engine: it downloads the browser engine and on-device models, runs a health check, and reports each component. Adding --agents wires the named agents in the same run, so a coding agent you use daily is ready in one command.

  • Supported agents--agents takes any of claude-code · cursor · codex · gemini-cli · opencode · vscode · windsurf · zed · antigravity (comma-separated); wigolo writes the MCP config and, where supported, instructions for each.
  • Any other setup — any MCP client, agent framework, or self-hosted agent registers npx -y wigolo in its own MCP config. The installation guide has the exact config block for every client, plus Docker, Homebrew, and single-file-binary channels.
  • More on the way — the supported list keeps growing, and a PR to add your agent is welcome; see CONTRIBUTING.md.
  • Interactive setup--interactive is a plain-text flow; --wizard is the full terminal TUI.
  • Defer downloads--no-warmup waits until first use. A failed component download never fails setup; init reports what's not ready with the exact fix and still completes.

init is unattended by default, so it's safe in scripts and CI, and any setup problem surfaces right here in the per-component report, before your agent's first call. Search, fetch, crawl, extract, cache, and find-similar work with no API key. Check it's healthy anytime:

npx wigolo doctor

To remove everything cleanly, run npx wigolo config --uninstall --yes. You can also paste the installation guide into any AI assistant and let it do the setup; it's written to be self-contained.

Recommended — a free key for research & agent

Search, fetch, crawl, extract, cache, and find-similar are fully keyless. research, agent, and search format=answer use an LLM to write the synthesized, cited answer. Without one they hand back a raw brief and evidence for your agent to assemble. A free Gemini key turns that into a finished answer:

export WIGOLO_LLM_PROVIDER=gemini
export GEMINI_API_KEY=<free-key>      # grab one at aistudio.google.com/apikey — the free tier is plenty

Any provider works (anthropic · openai · groq), or stay fully local and keyless with WIGOLO_LLM_PROVIDER=ollama (or any OpenAI-compatible URL). Set it in your shell or your agent's MCP env block. Providers, models, and the keyless local-model ladder are in the configuration guide.

What your agent gets back

Every search result is evidence the agent can act on. It carries a verbatim excerpt pinned to its exact position in the source, a citation ID the agent can quote, and a score it can inspect (abridged real shape):

{
  "results": [{
    "title": "Logical replication - PostgreSQL docs",
    "url": "https://www.postgresql.org/docs/current/logical-replication.html",
    "excerpt": "Logical replication is a method of replicating data objects…",
    "citation_id": "src-1",
    "source_span": { "start": 1042, "end": 1305 },          // byte-exact provenance
    "evidence_score": { "final": 0.86, "semantic": 0.91, "lexical": 0.78, "engine_consensus": 3 }
  }],
  "citations": [{ "id": "src-1", "url": "" }],
  "freshness_signal": { "published": "2026-05-12", "confidence": "high" }
}

Weak results get flagged as junk by wigolo's own scorer. Failed engines are reported and stale cache is labeled, so the agent always knows what it's standing on. Full response contracts per tool are in the tools reference.

Tools

Tool What it does
🔎 search Multi-engine web search (18 direct adapters) with rank fusion, ML reranking, and an explainable per-result score. Pass a query array for parallel breadth. Scope by domain and time range, match an exact phrase, or return image results.
📄 fetch Load one URL through a tiered router that auto-escalates from plain HTTP to a headless browser engine on anti-bot challenges or SPA shells. Clean markdown + metadata + links. Handles PDFs, a single-heading section, authenticated sessions, and page actions (click / type / scroll / screenshot).
🕸️ crawl Multi-page crawl — BFS, DFS, sitemap, or map-only. Per-domain rate limits, robots.txt respect, boilerplate dedup.
🧩 extract Structured data from a page: tables, metadata, JSON-LD, brand identity, named schemas (Article / Recipe / Product / …), or any custom JSON Schema.
💾 cache Query everything already seen — keyword or hybrid semantic. Plus stats, clear, and change detection.
🧲 find_similar Pages similar to a URL or a concept, via 3-way fusion of keyword + semantic + live web.
🧠 research Decompose a question → fan out sub-queries → fetch sources → synthesize a cited report (or a structured brief the host LLM writes from).
🤖 agent Autonomous gather loop: plan → search → fetch → extract → synthesize, with a step log, time budget, and optional output schema.
🔁 diff + ⏱️ watch See exactly what changed on a page since last visit; re-check on demand and deliver changes to a webhook.

Every tool also runs from the terminal (wigolo search "…" --json), from an interactive shell with NDJSON piping (wigolo shell), over REST, and through the SDKs — CLI reference. Per-tool guides with the full parameter set are in docs/tools.md; runnable examples are in examples/.

Why it's different

wigolo isn't a free stand-in for the paid tools — it's built to match them. It's a focused web layer for your agents: an MCP and REST surface they call directly, with the search and extraction quality the paid services charge for. What separates it:

  • Built for agents. One MCP call fans out many queries across many engines in parallel, which a serial host tool-loop can't replicate. Every result carries transparent per-result scoring, and output is budget-aware.
  • Honest output. Stale cache, failed fetches, degraded backends, and truncation are surfaced in the result. When a bot-protected page can't be read, you get a labeled blocked_by_challenge failure, not a challenge shell returned as content.
  • $0 per query, free to re-query. Default search talks to public engines through direct adapters; the reranker and embeddings run on-device. Every response is cached, so asking again is instant and costs nothing.
  • Private by default. Cache, embeddings, models, and config live under ~/.wigolo/. Nothing reaches a third party unless you explicitly opt into an LLM for synthesis.

Here's what one real result looks like, dissected. It includes the failed engine and the weak result, because those are part of the answer too:

Anatomy of a wigolo result: explainable score decomposition, live engine telemetry, surfaced degradation, self-flagged junk — one real query, captured live

Benchmark

All four tools converged on the same core answer, and only one of them handed back verbatim, byte-pinned evidence while doing it.

One cold query ran live inside a single Claude Fable 5 session, fanned out to four web tools on equal footing (built-in WebSearch, wigolo, Tavily, Exa), and was judged by the agent on the evidence alone. All four converged on the same answer and the same top source, so the parity is demonstrated on-screen. wigolo alone returned verbatim excerpts pinned to byte-offset source spans, an explainable score decomposition, and live per-engine telemetry, and its own scorer flagged two weak results as junk. The cloud tools earn their place too: Exa rendered the official docs' comparison matrix in full. Run your own query and you'll see the same shape.

wigolo vs built-in WebSearch, Tavily, and Exa on one real query, driven by Claude Fable 5

How it compares

wigolo Firecrawl Exa Tavily
Multi-engine web search
Fetch & structured extraction
Whole-site crawl & map
Verbatim excerpts pinned to byte-offset source spans
Explainable per-result score decomposition
Persistent local memory — re-query instantly, offline
Query data stays on your machine
API key / account none required required required
Cost per query $0 metered metered metered

Feature standing as of July 2026 — check each vendor's docs for current state.

That last row compounds, because agents ask in bursts:

The meter: a metered cloud API's cost climbs with every query while wigolo stays flat at zero dollars — illustrative pricing

Beyond your editor

The same ten tools serve every kind of agent, over whichever surface fits: MCP for coding agents, REST for everything else, SDKs to embed, and framework wrappers to drop in.

REST API — wigolo serve

One process exposes a plain-JSON REST API next to the MCP transport. No MCP client needed, just curl:

wigolo serve                          # 127.0.0.1:3333 — loopback is open; off-loopback requires a token

curl -sX POST http://127.0.0.1:3333/v1/search \
  -H 'Content-Type: application/json' \
  -d '{"query":"local-first software","max_results":5}'

POST /v1/{tool} covers all ten tools, GET /openapi.json is the OpenAPI 3.1 contract, and /mcp + /sse serve remote MCP clients from the same port. Bind past loopback and a bearer token is required, so the server fails closed by default. Point n8n, a Hermes-style assistant, or any self-hosted agent at it. → REST API

SDKs — TypeScript & Python

Thin, typed clients with an embedded local mode that finds or starts the daemon for you. No separate serve step.

TypeScriptnpm install wigolo-sdk (zero-dep; Node / Bun / Deno / edge):

import { createLocalClient } from 'wigolo-sdk/local';

const { client, close } = await createLocalClient();   // reuse a running daemon, or spawn one
const res = await client.search({ query: 'local-first web search', max_results: 5 });
console.log(res.results.map((r) => r.title));
await close();                                          // stops the daemon only if this call spawned it

Pythonpip install wigolo (standard library only; sync + async):

from wigolo import local_client

with local_client() as client:                          # reuse a healthy daemon, or spawn one
    res = client.search(query="local-first web search", max_results=5)
    for r in res["results"]:
        print(r["title"], r["url"])

SDKs & embedded mode

Framework integrations

Drop wigolo's tools into the framework you already use. You get the full ten-tool surface, including the cache / find_similar / research / agent that most framework web-tools don't ship:

Framework Package What you get
LangChain wigolo-langchain each tool as a BaseTool, plus a BaseRetriever over search / find_similar for RAG
CrewAI wigolo-crewai wigolo_tools() → hand the set to any crew
LlamaIndex wigolo-llamaindex a BaseReader that loads fetched / crawled / searched pages as documents
Vercel AI SDK wigolo-vercel-ai-sdk tool factories for generateText / streamText, edge-friendly

Framework integrations

Docker

# stdio MCP — wire it into any MCP client as command: docker
docker run -i --rm -v wigolo-data:/data ghcr.io/knockoutez/wigolo

# HTTP server for remote / multi-client use
docker run -p 3333:3333 -v wigolo-data:/data \
  -e WIGOLO_API_TOKEN=a-long-random-secret \
  ghcr.io/knockoutez/wigolo serve --host 0.0.0.0

The slim image lazy-loads models into the volume; :full preinstalls the browser engine. Also on Docker Hub as towhid69420/wigolo. → installation & all channels

Agent skills

An 11-pack skill catalog teaches your coding agent to drive each tool well. It's installed by init and managed with wigolo skills add|list|remove. → skills

One note for self-hosters: some challenge-protected sites score IP reputation, so a datacenter IP won't clear walls a home connection would. wigolo labels those failures, and the self-hosting guide covers the opt-in proxy answer.

Star history

wigolo GitHub stars over time

Refreshed daily from the GitHub API. Add a ⭐ if wigolo is useful to you.

Architecture

A single Node process speaks MCP (JSON-RPC over stdio). Everything heavy is local and lazy-loaded, so a zero-key install pays nothing for the parts it isn't using.

flowchart TD
    A["🤖 AI agent<br/>any MCP client · REST · SDK"]
    A -->|MCP over stdio| B["<b>wigolo</b><br/>10 tools · dynamic instructions<br/>in-process browser pool + cache + models"]

    B --> C{"Tool layer"}
    C --> T1["search · fetch · crawl · extract"]
    C --> T2["cache · find_similar · research · agent"]

    T1 --> F["⚙️ Fetch router<br/>tiered escalation, learned per domain"]
    T1 --> S["⚙️ Search<br/>18 engines → rank fusion → ML rerank<br/><i>explainable evidence score</i>"]
    T2 --> DB[("🗄️ Local cache<br/>keyword + vector index")]
    T2 --> ML["🧠 On-device ML<br/>embeddings + reranker"]

    F -.->|optional| LLM["☁️ LLM<br/>synthesis only · opt-in"]
    S -.->|optional| SX["🔀 Aggregator backend<br/>opt-in legacy / hybrid"]

    F --> WEB["🌍 Public web"]
    S --> WEB

    style B fill:#7c3aed,stroke:#5b21b6,color:#fff
    style WEB fill:#0ea5e9,stroke:#0369a1,color:#fff
    style DB fill:#1e293b,stroke:#334155,color:#fff
    style LLM stroke-dasharray: 5 5
    style SX stroke-dasharray: 5 5
Loading
  • Code beats model. Deterministic work stays off the LLM: canonicalization, rank fusion, dedup, and schema matching. The model is reserved for judgment, opt-in, and capped per request. LLM-filled fields are checked against the source and nulled if absent.
  • Signal-driven routing. The fetch ladder escalates to a real browser on observable signals, not domain guesses: SPA markers, challenge bodies, thin content. It learns per domain, unlearns when a site stops needing it, and wigolo tune list shows you exactly what it learned.
  • Reads pages the way a browser does. Tiered fetching waits out interstitial challenges and reuses clearances per domain, politely: robots.txt respected, per-domain rate limits, research-grade volumes. When a wall stays up, the failure is labeled and reported.

Configuration

A clean install works out of the box. Three settings raise output quality:

# 1. Synthesis — the biggest lever (research / agent / search-answer write real prose)
export WIGOLO_LLM_PROVIDER=gemini                   # or anthropic / openai / groq / ollama (keyless)
export GEMINI_API_KEY=<your-key>

# 2. Wider retrieval funnel
export WIGOLO_SEARCH=hybrid                         # core engines + aggregator fallback
export WIGOLO_GITHUB_TOKEN=...                      # GitHub code search 10 → 30 req/min

# 3. Land more fetches, stay warm
export WIGOLO_TLS_TIER=auto                         # per-domain learned fetch hardening
export WIGOLO_EAGER_WARMUP=1                        # pay the ~1s model load up front

Per-call habits that pay off: query arrays (["a","b","c"]) for parallel breadth · search_depth: "deep" for queries that matter · include_domains as a hard filter for docs lookups. The full reference covers every environment variable, config-file key, search backend, cache TTL, and serve limit; it's in the configuration guide.

Docs & examples

docs/ — the complete manual: getting started · installation & channels · configuration · tools reference · CLI & shell · REST API · SDKs & integrations · self-hosting · agent skills · plugins · troubleshooting & FAQ · privacy & security

examples/ — runnable, each with a README (and most with a terminal recording): one-shot CLI, NDJSON shell pipelines, REST via curl, TypeScript & Python SDKs, Vercel AI SDK tools, pointing self-hosted n8n at a remote wigolo, watch-with-webhook, and writing your own search-engine plugin. The docs are also rendered on the site at knockoutez.github.io/wigolo/docs.

Beta & feedback

wigolo is in public beta. Everything documented here works and is held to a 7,600-test suite; it's stable, and beta is about the polish bar. It stays beta until enough people have used it, kicked it, and starred it that calling it v1 means something. Your feedback shapes what comes next, and every report is read, usually the same day:

If wigolo earns a place in your setup, three things keep it going: a ⭐ star (it's how open source gets found), a ☕ coffee (there's no paid tier and never will be), or an email that goes straight to the one developer who wrote the code.

Troubleshooting

wigolo doctor names any broken component and the exact env var or command that fixes it; wigolo doctor --fix repairs the common cases, and wigolo verify health-checks every component. A component failing during init doesn't break wigolo: init still exits 0, and core search / fetch / crawl / extract / cache work with no models and no browser. Quick hits:

  • Slow or failed downloads — re-run wigolo warmup --all (or --browser / --embeddings / --reranker); they resume and retry.
  • Browser won't launch on Linuxwigolo warmup --browser installs the OS libraries (or prints the exact command).
  • Native build error / unusual Node — use an LTS: Node 20, 22, or 24.
  • Behind a proxyUSE_PROXY=true + PROXY_URL; add NODE_EXTRA_CA_CERTS for TLS-inspecting proxies.

The full guide covers per-symptom fixes, a "what still works when X fails" map, platform notes (incl. linux-arm64), and offline installs: docs/troubleshooting.md.

FAQ

Free? What's the catch?

No catch by design. The expensive parts (ranking, embeddings, the browser engine) run on your hardware, so there's no per-query cost to recover and no reason for a meter. It's sustained by donations, and the AGPL license legally prevents a switch into a closed hosted product.

Is the quality really on par with the paid services?

The benchmark section above is a live 4-way run you can reproduce: everyday agent queries land at parity, the paid tools still win some deep-extraction edge cases, and crawling is where wigolo is strongest. Every result shows its scoring, so you don't have to take anyone's word for it.

Won't public search engines block or rot?

It's engineered for exactly that: 18 engines fused with rank fusion (any one failing barely moves results), a tiered fetch ladder with per-domain learning, and an optional aggregator fallback. Degraded backends are reported in the output, and the local cache means everything already seen keeps working regardless.

Is this kind of scraping OK?

wigolo reads the public web the way a browser does: robots.txt respected by default, per-domain rate limits, and research-grade volumes for one agent on one machine. It sits deliberately at the polite end of the spectrum.

AGPL — can I use this at work?

Yes, freely, company-wide. The license only bites if you modify wigolo and run it as a network service, in which case you must publish those modifications; using it as a local dev tool carries zero obligation. For commercial-licensing questions, reach out.

Why 1.5 GB of disk?

That's the on-device brain: a full browser engine plus the ranking and embedding models the cloud services run on their side and bill you for. Once it's on disk, every query uses it for free.

Available on

Homebrew, curl | sh, and the single-file binary are covered in the installation guide. Use one channel per machine; they all share ~/.wigolo.

Contributing

Bug reports, feature requests, and PRs are all welcome; see CONTRIBUTING.md. Keep tool handlers thin, add tests, and run the suite before opening a PR. The friendliest entry point is the plugin system for custom search engines and extractors: add a search engine in ~100 lines, with a template in examples/plugin-search-engine.

License

GNU AGPL-3.0-only. Free to use, modify, and self-host, including inside a company. The one obligation: if you run a modified version as a network service, you must publish your modified source under the same license. That keeps wigolo open while preventing a closed, hosted fork. See SECURITY.md to report a vulnerability and TRADEMARK.md for use of the name. For commercial-licensing questions, reach out.


wigolo is free and actively maintained, and it's meant to stay that way. If it saves you a metered search bill, a ⭐, a sharp issue, or a ☕ coffee helps keep it sustainable.

Built and maintained by @KnockOutEZ · ktowhid20@gmail.com · X · LinkedIn

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

11 total
  1. v0.2.1v0.2.1Jul 19, 2026

    ## What's Changed * fix(watch): hash full-body content, not view-truncated markdown by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/186 * feat: honest research/agent degradation + free-key guidance in tool descriptions by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/187 * docs: public-face overhaul — lean README, public docs/, examples/, docs on site by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/185 * fix: fresh-install reliability across platforms + clean-machine CI gate by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/196 * docs(troubleshooting): cover setup/download failure modes across platforms by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/200 * Update Buy Me a Coffee username in FUNDING.yml by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/202 * ci: keep external-API and arm64-embeddings out of required-check failures by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/201 * fix(fetch): unify SPA settle into one bounded shared path + content_completeness signal by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/189 * chore(release): v0.2.1 by @KnockOutEZ in https://github.com/KnockOutEZ/

  2. v0.2.0v0.2.0Jul 17, 2026

    ## What's Changed * fix(mcpb): non-empty Smithery release payload by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/169 * ci: auto-publish to MCP Registry + Smithery on release by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/170 * docs: use ## Tools heading for directory auto-extraction by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/171 * chore: add mcp.json manifest for directory auto-detection by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/173 * chore: add 400x400 logo asset by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/174 * docs: add Available on section by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/175 * security: harden URL guards, plugin install, exec surface by @dandycrypto in https://github.com/KnockOutEZ/wigolo/pull/172 * fix(searxng): pip self-upgrade on Windows, gate native bootstrap, accept podman by @YoshiTabletopGamer in https://github.com/KnockOutEZ/wigolo/pull/162 * fix(deps): sync package-lock with hono override to unbreak npm ci by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/176 * feat: zero-config onboarding + distribution + shell (P0–P6) — v0.2.0 by @KnockOutEZ in https://g

  3. v0.1.43-beta.2v0.1.43-beta.2Jul 13, 2026

    ## What's Changed * chore(release): v0.1.43-beta.2 by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/168 **Full Changelog**: https://github.com/KnockOutEZ/wigolo/compare/v0.1.43-beta.1...v0.1.43-beta.2

  4. v0.1.43-beta.1v0.1.43-beta.1Jul 13, 2026

    ## What's Changed * chore: Docker image + Smithery config + container publish workflow by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/163 * chore: publish docker image on manual dispatch by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/164 * docs: correct Docker Hub namespace by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/165 * chore: MCP Registry + Glama + Smithery distribution metadata by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/166 * chore(release): v0.1.43-beta.1 by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/167 **Full Changelog**: https://github.com/KnockOutEZ/wigolo/compare/v0.1.43-beta.0...v0.1.43-beta.1

  5. v0.1.43-beta.0v0.1.43-beta.0Jul 12, 2026

    ## What's Changed * fix(cli): register Claude Code MCP at user scope, not project scope by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/159 * chore(release): v0.1.43-beta.0 by @KnockOutEZ in https://github.com/KnockOutEZ/wigolo/pull/160 **Full Changelog**: https://github.com/KnockOutEZ/wigolo/compare/v0.1.42-beta.0...v0.1.43-beta.0

Code frequency

additions and deletions
+125.1K-125.1KWeek of 2026-04-05: +4,130 linesWeek of 2026-04-05: -0 linesWeek of 2026-04-12: +81,453 linesWeek of 2026-04-12: -4,468 linesWeek of 2026-04-19: +0 linesWeek of 2026-04-19: -0 linesWeek of 2026-04-26: +9,729 linesWeek of 2026-04-26: -2,356 linesWeek of 2026-05-03: +3,075 linesWeek of 2026-05-03: -946 linesWeek of 2026-05-10: +982 linesWeek of 2026-05-10: -482 linesWeek of 2026-05-17: +125,105 linesWeek of 2026-05-17: -12,832 linesWeek of 2026-05-24: +64,158 linesWeek of 2026-05-24: -11,103 linesWeek of 2026-05-31: +6,709 linesWeek of 2026-05-31: -2,260 linesWeek of 2026-06-07: +9,388 linesWeek of 2026-06-07: -1,251 linesWeek of 2026-06-14: +3,536 linesWeek of 2026-06-14: -505 linesWeek of 2026-06-21: +17 linesWeek of 2026-06-21: -44 linesWeek of 2026-06-28: +14,863 linesWeek of 2026-06-28: -3,095 linesWeek of 2026-07-05: +14,089 linesWeek of 2026-07-05: -2,006 linesWeek of 2026-07-12: +69,641 linesWeek of 2026-07-12: -11,293 linesWeek of 2026-07-19: +14,359 linesWeek of 2026-07-19: -713 linesWeek of 2026-07-26: +2,359 linesWeek of 2026-07-26: -225 linesWeek of 2026-08-02: +0 linesWeek of 2026-08-02: -0 linesApr 5, 2026Aug 2, 2026
+423.6K lines added, -53.6K removed over the last year.

Commits per week

last 52 weeks
4090Week of 2025-08-10: 0 commitsWeek of 2025-08-17: 0 commitsWeek of 2025-08-24: 0 commitsWeek of 2025-08-31: 0 commitsWeek of 2025-09-07: 0 commitsWeek of 2025-09-14: 0 commitsWeek of 2025-09-21: 0 commitsWeek of 2025-09-28: 0 commitsWeek of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 1 commitsWeek of 2026-04-12: 409 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 76 commitsWeek of 2026-05-03: 32 commitsWeek of 2026-05-10: 5 commitsWeek of 2026-05-17: 117 commitsWeek of 2026-05-24: 323 commitsWeek of 2026-05-31: 72 commitsWeek of 2026-06-07: 75 commitsWeek of 2026-06-14: 39 commitsWeek of 2026-06-21: 1 commitsWeek of 2026-06-28: 88 commitsWeek of 2026-07-05: 20 commitsWeek of 2026-07-12: 303 commitsWeek of 2026-07-19: 61 commitsWeek of 2026-07-26: 30 commitsWeek of 2026-08-02: 0 commitsAug 10, 2025Aug 2, 2026
1.7K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 28 commitsSun 1:00 — 24 commitsSun 2:00 — 23 commitsSun 3:00 — 12 commitsSun 4:00 — 5 commitsSun 5:00 — 2 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 1 commitsSun 9:00 — 6 commitsSun 10:00 — 0 commitsSun 11:00 — 2 commitsSun 12:00 — 10 commitsSun 13:00 — 6 commitsSun 14:00 — 27 commitsSun 15:00 — 20 commitsSun 16:00 — 13 commitsSun 17:00 — 3 commitsSun 18:00 — 10 commitsSun 19:00 — 15 commitsSun 20:00 — 18 commitsSun 21:00 — 13 commitsSun 22:00 — 16 commitsSun 23:00 — 25 commitsMon 0:00 — 27 commitsMon 1:00 — 10 commitsMon 2:00 — 5 commitsMon 3:00 — 9 commitsMon 4:00 — 6 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 0 commitsMon 8:00 — 0 commitsMon 9:00 — 3 commitsMon 10:00 — 4 commitsMon 11:00 — 7 commitsMon 12:00 — 25 commitsMon 13:00 — 13 commitsMon 14:00 — 21 commitsMon 15:00 — 18 commitsMon 16:00 — 16 commitsMon 17:00 — 7 commitsMon 18:00 — 1 commitsMon 19:00 — 8 commitsMon 20:00 — 9 commitsMon 21:00 — 12 commitsMon 22:00 — 9 commitsMon 23:00 — 10 commitsTue 0:00 — 0 commitsTue 1:00 — 3 commitsTue 2:00 — 4 commitsTue 3:00 — 9 commitsTue 4:00 — 10 commitsTue 5:00 — 5 commitsTue 6:00 — 7 commitsTue 7:00 — 2 commitsTue 8:00 — 0 commitsTue 9:00 — 2 commitsTue 10:00 — 30 commitsTue 11:00 — 9 commitsTue 12:00 — 0 commitsTue 13:00 — 4 commitsTue 14:00 — 19 commitsTue 15:00 — 2 commitsTue 16:00 — 0 commitsTue 17:00 — 0 commitsTue 18:00 — 13 commitsTue 19:00 — 6 commitsTue 20:00 — 14 commitsTue 21:00 — 7 commitsTue 22:00 — 24 commitsTue 23:00 — 9 commitsWed 0:00 — 22 commitsWed 1:00 — 21 commitsWed 2:00 — 17 commitsWed 3:00 — 16 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 18 commitsWed 7:00 — 0 commitsWed 8:00 — 0 commitsWed 9:00 — 0 commitsWed 10:00 — 5 commitsWed 11:00 — 5 commitsWed 12:00 — 9 commitsWed 13:00 — 4 commitsWed 14:00 — 4 commitsWed 15:00 — 40 commitsWed 16:00 — 10 commitsWed 17:00 — 13 commitsWed 18:00 — 28 commitsWed 19:00 — 16 commitsWed 20:00 — 13 commitsWed 21:00 — 7 commitsWed 22:00 — 14 commitsWed 23:00 — 22 commitsThu 0:00 — 31 commitsThu 1:00 — 2 commitsThu 2:00 — 9 commitsThu 3:00 — 29 commitsThu 4:00 — 46 commitsThu 5:00 — 6 commitsThu 6:00 — 0 commitsThu 7:00 — 0 commitsThu 8:00 — 5 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 2 commitsThu 12:00 — 19 commitsThu 13:00 — 17 commitsThu 14:00 — 33 commitsThu 15:00 — 5 commitsThu 16:00 — 8 commitsThu 17:00 — 4 commitsThu 18:00 — 13 commitsThu 19:00 — 11 commitsThu 20:00 — 8 commitsThu 21:00 — 3 commitsThu 22:00 — 16 commitsThu 23:00 — 24 commitsFri 0:00 — 6 commitsFri 1:00 — 16 commitsFri 2:00 — 0 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 5 commitsFri 6:00 — 12 commitsFri 7:00 — 9 commitsFri 8:00 — 5 commitsFri 9:00 — 0 commitsFri 10:00 — 17 commitsFri 11:00 — 11 commitsFri 12:00 — 3 commitsFri 13:00 — 25 commitsFri 14:00 — 6 commitsFri 15:00 — 2 commitsFri 16:00 — 8 commitsFri 17:00 — 13 commitsFri 18:00 — 7 commitsFri 19:00 — 7 commitsFri 20:00 — 7 commitsFri 21:00 — 10 commitsFri 22:00 — 12 commitsFri 23:00 — 14 commitsSat 0:00 — 22 commitsSat 1:00 — 15 commitsSat 2:00 — 6 commitsSat 3:00 — 2 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 1 commitsSat 8:00 — 0 commitsSat 9:00 — 3 commitsSat 10:00 — 5 commitsSat 11:00 — 6 commitsSat 12:00 — 6 commitsSat 13:00 — 8 commitsSat 14:00 — 7 commitsSat 15:00 — 4 commitsSat 16:00 — 13 commitsSat 17:00 — 20 commitsSat 18:00 — 9 commitsSat 19:00 — 13 commitsSat 20:00 — 2 commitsSat 21:00 — 17 commitsSat 22:00 — 27 commitsSat 23:00 — 19 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits1,965 (98%)
Community commits31 (2%)

1,996 commits in total over the last year.

DateListRankStars gained
Jul 29, 2026weekly#19+1,478
Jul 28, 2026weekly#19+1,478
Jul 21, 2026daily#17+3
Jul 19, 2026daily#7+8
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    453.6K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    385.5K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • awesome-selfhosted/awesome-selfhosted

    A list of Free Software network services and web applications which can be hosted on your own servers

    311.2K stars