<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Wigolo on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/wigolo/</link>
        <description>Recent content in Wigolo on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Mon, 20 Jul 2026 18:29:23 +0800</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/wigolo/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>wigolo</title>
        <link>https://producthunt.programnotes.cn/en/p/wigolo/</link>
        <pubDate>Mon, 20 Jul 2026 18:29:23 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/wigolo/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1607533018176-dab607ee70e0?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3ODQ1NDMxMzl8&amp;ixlib=rb-4.1.0" alt="Featured image of post wigolo" /&gt;&lt;h1 id=&#34;knockoutezwigolo&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/KnockOutEZ/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;KnockOutEZ/wigolo&lt;/a&gt;
&lt;/h1&gt;&lt;div align=&#34;center&#34;&gt;
&lt;img alt=&#34;wigolo — the go-to web for your agent&#34; src=&#34;assets/brand/wigolo-banner.png&#34; width=&#34;640&#34;&gt;
&lt;p&gt;Local-first web intelligence for AI agents — &lt;strong&gt;no keys, no cloud, no metered bill.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;works with  &lt;strong&gt;Claude Code · Cursor · Codex · Gemini CLI · VS Code · Windsurf · Zed · Antigravity&lt;/strong&gt;&lt;/sub&gt;
&lt;br&gt;
&lt;sub&gt;and beyond  &lt;strong&gt;LangChain · CrewAI · LlamaIndex · Vercel AI SDK · n8n &amp;amp; self-hosted agents · any MCP client · plain REST&lt;/strong&gt;&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/npm/v/wigolo?color=cb3837&amp;amp;logo=npm&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;npm&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/npm/dm/wigolo?color=cb3837&amp;amp;logo=npm&amp;amp;label=downloads&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;npm downloads&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/KnockOutEZ/wigolo/stargazers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/stars/KnockOutEZ/wigolo?style=flat&amp;amp;logo=github&amp;amp;color=e3b341&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub stars&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/KnockOutEZ/wigolo/actions/workflows/ci.yml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/actions/workflow/status/KnockOutEZ/wigolo/ci.yml?branch=main&amp;amp;logo=github&amp;amp;label=CI&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;CI&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://nodejs.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/node-%E2%89%A520-339933?logo=node.js&amp;amp;logoColor=white&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;node&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://modelcontextprotocol.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/MCP-server-7c3aed&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;MCP&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;#license&#34; &gt;&lt;img src=&#34;https://img.shields.io/badge/license-AGPL--3.0-2563eb&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;license&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;#beta--feedback&#34; &gt;&lt;img src=&#34;https://img.shields.io/badge/status-public%20beta-b7791f&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;status&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://x.com/yourtowhid&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/follow-%40yourtowhid-000000?logo=x&amp;amp;logoColor=white&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;follow on X&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://trendshift.io/repositories/79424?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-79424&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://trendshift.io/api/badge/repositories/79424&#34; alt=&#34;wigolo on Trendshift&#34; width=&#34;250&#34; height=&#34;55&#34;/&gt;&lt;/a&gt;
&lt;a href=&#34;https://trendshift.io/repositories/79424?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-79424&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://trendshift.io/api/badge/trendshift/repositories/79424/daily?language=TypeScript&#34; alt=&#34;KnockOutEZ%2Fwigolo | Trendshift&#34; width=&#34;250&#34; height=&#34;55&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;#quickstart&#34; &gt;Quickstart&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;#tools&#34; &gt;Tools&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;#why-its-different&#34; &gt;Why wigolo&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;#benchmark&#34; &gt;Benchmark&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/README.md&#34; &gt;Docs&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;examples/README.md&#34; &gt;Examples&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;#beta--feedback&#34; &gt;Feedback&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;#faq&#34; &gt;FAQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;New features and updates ship steadily. Follow &lt;a href=&#34;https://x.com/yourtowhid&#34;&gt;&lt;b&gt;@yourtowhid on X&lt;/b&gt;&lt;/a&gt; for all of it and new ways to use wigolo, and reach out there for collaborations or feedback · also on &lt;a href=&#34;https://www.linkedin.com/in/yourtowhid/&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;wigolo gives an AI agent one surface for everything web-related: &lt;strong&gt;search, fetch, crawl, extract, cache, find-similar, research,&lt;/strong&gt; 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 &lt;code&gt;~/.wigolo/&lt;/code&gt;, and no bill grows with how much your agent thinks.&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;img alt=&#34;wigolo demo — Claude Code answering a live web question through wigolo, no API keys&#34; src=&#34;assets/wigolo-demo.gif&#34; width=&#34;800&#34;&gt;
&lt;/div&gt;
&lt;h2 id=&#34;quickstart&#34;&gt;Quickstart
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx wigolo init                              &lt;span class=&#34;c1&#34;&gt;# set up the local engine — any system&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx wigolo init --agents&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;claude-code,cursor  &lt;span class=&#34;c1&#34;&gt;# …or set up + wire your day-to-day agents in one command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Requires &lt;strong&gt;Node ≥ 20&lt;/strong&gt; and ~1.5 GB of free disk on macOS, Linux, or Windows. Bare &lt;code&gt;init&lt;/code&gt; sets up the local engine: it downloads the browser engine and on-device models, runs a health check, and reports each component. Adding &lt;code&gt;--agents&lt;/code&gt; wires the named agents in the same run, so a coding agent you use daily is ready in one command.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supported agents&lt;/strong&gt; — &lt;code&gt;--agents&lt;/code&gt; takes any of &lt;code&gt;claude-code&lt;/code&gt; · &lt;code&gt;cursor&lt;/code&gt; · &lt;code&gt;codex&lt;/code&gt; · &lt;code&gt;gemini-cli&lt;/code&gt; · &lt;code&gt;vscode&lt;/code&gt; · &lt;code&gt;windsurf&lt;/code&gt; · &lt;code&gt;zed&lt;/code&gt; · &lt;code&gt;antigravity&lt;/code&gt; (comma-separated); wigolo writes the MCP config and instructions for each.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Any other setup&lt;/strong&gt; — any MCP client, agent framework, or self-hosted agent registers &lt;code&gt;npx -y wigolo&lt;/code&gt; in its own MCP config. The &lt;a class=&#34;link&#34; href=&#34;docs/installation.md&#34; &gt;installation guide&lt;/a&gt; has the exact config block for every client, plus Docker, Homebrew, and single-file-binary channels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More on the way&lt;/strong&gt; — the supported list keeps growing, and a PR to add your agent is welcome; see &lt;a class=&#34;link&#34; href=&#34;CONTRIBUTING.md&#34; &gt;CONTRIBUTING.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactive setup&lt;/strong&gt; — &lt;code&gt;--interactive&lt;/code&gt; is a plain-text flow; &lt;code&gt;--wizard&lt;/code&gt; is the full terminal TUI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defer downloads&lt;/strong&gt; — &lt;code&gt;--no-warmup&lt;/code&gt; waits until first use. A failed component download never fails setup; init reports what&amp;rsquo;s not ready with the exact fix and still completes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;init&lt;/code&gt; is unattended by default, so it&amp;rsquo;s safe in scripts and CI, and any setup problem surfaces right here in the per-component report, before your agent&amp;rsquo;s first call. &lt;strong&gt;Search, fetch, crawl, extract, cache, and find-similar work with no API key.&lt;/strong&gt; Check it&amp;rsquo;s healthy anytime:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx wigolo doctor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To remove everything cleanly, run &lt;code&gt;npx wigolo config --uninstall --yes&lt;/code&gt;. You can also paste the &lt;a class=&#34;link&#34; href=&#34;docs/installation.md&#34; &gt;installation guide&lt;/a&gt; into any AI assistant and let it do the setup; it&amp;rsquo;s written to be self-contained.&lt;/p&gt;
&lt;h3 id=&#34;recommended--a-free-key-for-research--agent&#34;&gt;Recommended — a free key for &lt;code&gt;research&lt;/code&gt; &amp;amp; &lt;code&gt;agent&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Search, fetch, crawl, extract, cache, and find-similar are &lt;strong&gt;fully keyless&lt;/strong&gt;. &lt;code&gt;research&lt;/code&gt;, &lt;code&gt;agent&lt;/code&gt;, and &lt;code&gt;search format=answer&lt;/code&gt; 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:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;WIGOLO_LLM_PROVIDER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gemini
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;lt;free-key&amp;gt;      &lt;span class=&#34;c1&#34;&gt;# grab one at aistudio.google.com/apikey — the free tier is plenty&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Any provider works (&lt;code&gt;anthropic&lt;/code&gt; · &lt;code&gt;openai&lt;/code&gt; · &lt;code&gt;groq&lt;/code&gt;), or stay fully local and keyless with &lt;code&gt;WIGOLO_LLM_PROVIDER=ollama&lt;/code&gt; (or any OpenAI-compatible URL). Set it in your shell or your agent&amp;rsquo;s MCP &lt;code&gt;env&lt;/code&gt; block. Providers, models, and the keyless local-model ladder are in the &lt;a class=&#34;link&#34; href=&#34;docs/configuration.md&#34; &gt;configuration guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-your-agent-gets-back&#34;&gt;What your agent gets back
&lt;/h2&gt;&lt;p&gt;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):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-jsonc&#34; data-lang=&#34;jsonc&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;results&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Logical replication - PostgreSQL docs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://www.postgresql.org/docs/current/logical-replication.html&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;excerpt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Logical replication is a method of replicating data objects…&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;citation_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;src-1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;source_span&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1042&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1305&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;          &lt;span class=&#34;c1&#34;&gt;// byte-exact provenance
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;evidence_score&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;final&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.86&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;semantic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.91&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;lexical&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.78&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;engine_consensus&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;citations&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;src-1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;…&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;freshness_signal&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;published&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;2026-05-12&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;confidence&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;high&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Weak results get flagged as junk by wigolo&amp;rsquo;s own scorer. Failed engines are reported and stale cache is labeled, so the agent always knows what it&amp;rsquo;s standing on. Full response contracts per tool are in the &lt;a class=&#34;link&#34; href=&#34;docs/tools.md&#34; &gt;tools reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Tool&lt;/th&gt;
					&lt;th&gt;What it does&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;🔎 &lt;code&gt;search&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Multi-engine web search (18 direct adapters) with rank fusion, ML reranking, and an explainable per-result score. Pass a query &lt;strong&gt;array&lt;/strong&gt; for parallel breadth. Scope by domain and time range, match an exact phrase, or return image results.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;📄 &lt;code&gt;fetch&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;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 &lt;code&gt;section&lt;/code&gt;, authenticated sessions, and page actions (click / type / scroll / screenshot).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;🕸️ &lt;code&gt;crawl&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Multi-page crawl — BFS, DFS, sitemap, or map-only. Per-domain rate limits, robots.txt respect, boilerplate dedup.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;🧩 &lt;code&gt;extract&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Structured data from a page: tables, metadata, JSON-LD, brand identity, named schemas (Article / Recipe / Product / …), or any custom JSON Schema.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;💾 &lt;code&gt;cache&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Query everything already seen — keyword or hybrid semantic. Plus stats, clear, and change detection.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;🧲 &lt;code&gt;find_similar&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Pages similar to a URL or a concept, via 3-way fusion of keyword + semantic + live web.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;🧠 &lt;code&gt;research&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Decompose a question → fan out sub-queries → fetch sources → synthesize a cited report (or a structured brief the host LLM writes from).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;🤖 &lt;code&gt;agent&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Autonomous gather loop: plan → search → fetch → extract → synthesize, with a step log, time budget, and optional output schema.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;🔁 &lt;code&gt;diff&lt;/code&gt; + ⏱️ &lt;code&gt;watch&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;See exactly what changed on a page since last visit; re-check on demand and deliver changes to a webhook.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every tool also runs from the terminal (&lt;code&gt;wigolo search &amp;quot;…&amp;quot; --json&lt;/code&gt;), from an interactive shell with NDJSON piping (&lt;code&gt;wigolo shell&lt;/code&gt;), over REST, and through the SDKs — &lt;a class=&#34;link&#34; href=&#34;docs/cli.md&#34; &gt;CLI reference&lt;/a&gt;. Per-tool guides with the full parameter set are in &lt;a class=&#34;link&#34; href=&#34;docs/tools.md&#34; &gt;docs/tools.md&lt;/a&gt;; runnable examples are in &lt;a class=&#34;link&#34; href=&#34;examples/README.md&#34; &gt;examples/&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;why-its-different&#34;&gt;Why it&amp;rsquo;s different
&lt;/h2&gt;&lt;p&gt;wigolo isn&amp;rsquo;t a free stand-in for the paid tools — it&amp;rsquo;s built to match them. It&amp;rsquo;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Built for agents.&lt;/strong&gt; One MCP call fans out many queries across many engines in parallel, which a serial host tool-loop can&amp;rsquo;t replicate. Every result carries transparent per-result scoring, and output is budget-aware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Honest output.&lt;/strong&gt; Stale cache, failed fetches, degraded backends, and truncation are surfaced in the result. When a bot-protected page can&amp;rsquo;t be read, you get a labeled &lt;code&gt;blocked_by_challenge&lt;/code&gt; failure, not a challenge shell returned as content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$0 per query, free to re-query.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private by default.&lt;/strong&gt; Cache, embeddings, models, and config live under &lt;code&gt;~/.wigolo/&lt;/code&gt;. Nothing reaches a third party unless you explicitly opt into an LLM for synthesis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;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:&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;picture&gt;
&lt;source media=&#34;(prefers-color-scheme: dark)&#34; srcset=&#34;assets/promo/anatomy-dark.svg&#34;&gt;
&lt;img alt=&#34;Anatomy of a wigolo result: explainable score decomposition, live engine telemetry, surfaced degradation, self-flagged junk — one real query, captured live&#34; src=&#34;assets/promo/anatomy.svg&#34; width=&#34;880&#34;&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;h2 id=&#34;benchmark&#34;&gt;Benchmark
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;All four tools converged on the same core answer, and only one of them handed back verbatim, byte-pinned evidence while doing it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One cold query ran live inside a single &lt;strong&gt;Claude Fable 5&lt;/strong&gt; session, fanned out to four web tools on equal footing (built-in &lt;strong&gt;WebSearch&lt;/strong&gt;, &lt;strong&gt;wigolo&lt;/strong&gt;, &lt;strong&gt;Tavily&lt;/strong&gt;, &lt;strong&gt;Exa&lt;/strong&gt;), 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&amp;rsquo; comparison matrix in full. Run your own query and you&amp;rsquo;ll see the same shape.&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;img alt=&#34;wigolo vs built-in WebSearch, Tavily, and Exa on one real query, driven by Claude Fable 5&#34; src=&#34;assets/wigolo-vs.gif&#34; width=&#34;900&#34;&gt;
&lt;/div&gt;
&lt;h3 id=&#34;how-it-compares&#34;&gt;How it compares
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;wigolo&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;Firecrawl&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;Exa&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;Tavily&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Multi-engine web search&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Fetch &amp;amp; structured extraction&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Whole-site crawl &amp;amp; map&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Verbatim excerpts pinned to byte-offset source spans&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Explainable per-result score decomposition&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Persistent local memory — re-query instantly, offline&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Query data stays on your machine&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;API key / account&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;none&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;required&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;required&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;required&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cost per query&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;$0&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;metered&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;metered&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;metered&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;sub&gt;Feature standing as of July 2026 — check each vendor&amp;rsquo;s docs for current state.&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;That last row compounds, because agents ask in bursts:&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;picture&gt;
&lt;source media=&#34;(prefers-color-scheme: dark)&#34; srcset=&#34;assets/promo/meter-dark.svg&#34;&gt;
&lt;img alt=&#34;The meter: a metered cloud API&#39;s cost climbs with every query while wigolo stays flat at zero dollars — illustrative pricing&#34; src=&#34;assets/promo/meter.svg&#34; width=&#34;880&#34;&gt;
&lt;/picture&gt;
&lt;/div&gt;
&lt;h2 id=&#34;beyond-your-editor&#34;&gt;Beyond your editor
&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;h3 id=&#34;rest-api--wigolo-serve&#34;&gt;REST API — &lt;code&gt;wigolo serve&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;One process exposes a plain-JSON REST API next to the MCP transport. No MCP client needed, just curl:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wigolo serve                          &lt;span class=&#34;c1&#34;&gt;# 127.0.0.1:3333 — loopback is open; off-loopback requires a token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -sX POST http://127.0.0.1:3333/v1/search &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s1&#34;&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;query&amp;#34;:&amp;#34;local-first software&amp;#34;,&amp;#34;max_results&amp;#34;:5}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;POST /v1/{tool}&lt;/code&gt; covers all ten tools, &lt;code&gt;GET /openapi.json&lt;/code&gt; is the OpenAPI 3.1 contract, and &lt;code&gt;/mcp&lt;/code&gt; + &lt;code&gt;/sse&lt;/code&gt; 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. → &lt;a class=&#34;link&#34; href=&#34;docs/rest-api.md&#34; &gt;REST API&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;sdks--typescript--python&#34;&gt;SDKs — TypeScript &amp;amp; Python
&lt;/h3&gt;&lt;p&gt;Thin, typed clients with an embedded local mode that finds or starts the daemon for you. No separate &lt;code&gt;serve&lt;/code&gt; step.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; — &lt;code&gt;npm install wigolo-sdk&lt;/code&gt; (zero-dep; Node / Bun / Deno / edge):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createLocalClient&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;wigolo-sdk/local&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;close&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createLocalClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// reuse a running daemon, or spawn one
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;res&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;local-first web search&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;max_results&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;                                          &lt;span class=&#34;c1&#34;&gt;// stops the daemon only if this call spawned it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt; — &lt;code&gt;pip install wigolo&lt;/code&gt; (standard library only; sync + async):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;wigolo&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;local_client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;local_client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;                          &lt;span class=&#34;c1&#34;&gt;# reuse a healthy daemon, or spawn one&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;local-first web search&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;max_results&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;results&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;→ &lt;a class=&#34;link&#34; href=&#34;docs/sdks.md&#34; &gt;SDKs &amp;amp; embedded mode&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;framework-integrations&#34;&gt;Framework integrations
&lt;/h3&gt;&lt;p&gt;Drop wigolo&amp;rsquo;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&amp;rsquo;t ship:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Framework&lt;/th&gt;
					&lt;th&gt;Package&lt;/th&gt;
					&lt;th&gt;What you get&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;LangChain&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;wigolo-langchain&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;each tool as a &lt;code&gt;BaseTool&lt;/code&gt;, plus a &lt;code&gt;BaseRetriever&lt;/code&gt; over search / find_similar for RAG&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CrewAI&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;wigolo-crewai&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;wigolo_tools()&lt;/code&gt; → hand the set to any crew&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;LlamaIndex&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;wigolo-llamaindex&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;a &lt;code&gt;BaseReader&lt;/code&gt; that loads fetched / crawled / searched pages as documents&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Vercel AI SDK&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;wigolo-vercel-ai-sdk&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;tool factories for &lt;code&gt;generateText&lt;/code&gt; / &lt;code&gt;streamText&lt;/code&gt;, edge-friendly&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;→ &lt;a class=&#34;link&#34; href=&#34;docs/sdks.md&#34; &gt;Framework integrations&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;docker&#34;&gt;Docker
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# stdio MCP — wire it into any MCP client as command: docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -i --rm -v wigolo-data:/data ghcr.io/knockoutez/wigolo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# HTTP server for remote / multi-client use&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -p 3333:3333 -v wigolo-data:/data &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -e &lt;span class=&#34;nv&#34;&gt;WIGOLO_API_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;a-long-random-secret &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ghcr.io/knockoutez/wigolo serve --host 0.0.0.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The slim image lazy-loads models into the volume; &lt;code&gt;:full&lt;/code&gt; preinstalls the browser engine. Also on Docker Hub as &lt;code&gt;towhid69420/wigolo&lt;/code&gt;. → &lt;a class=&#34;link&#34; href=&#34;docs/installation.md&#34; &gt;installation &amp;amp; all channels&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;agent-skills&#34;&gt;Agent skills
&lt;/h3&gt;&lt;p&gt;An 11-pack skill catalog teaches your coding agent to drive each tool well. It&amp;rsquo;s installed by &lt;code&gt;init&lt;/code&gt; and managed with &lt;code&gt;wigolo skills add|list|remove&lt;/code&gt;. → &lt;a class=&#34;link&#34; href=&#34;docs/skills.md&#34; &gt;skills&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One note for self-hosters: some challenge-protected sites score IP reputation, so a datacenter IP won&amp;rsquo;t clear walls a home connection would. wigolo labels those failures, and the &lt;a class=&#34;link&#34; href=&#34;docs/self-hosting.md&#34; &gt;self-hosting guide&lt;/a&gt; covers the opt-in proxy answer.&lt;/p&gt;
&lt;h2 id=&#34;star-history&#34;&gt;Star history
&lt;/h2&gt;&lt;div align=&#34;center&#34;&gt;
&lt;a href=&#34;https://www.star-history.com/#KnockOutEZ/wigolo&amp;Date&#34;&gt;
&lt;picture&gt;
&lt;source media=&#34;(prefers-color-scheme: dark)&#34; srcset=&#34;https://raw.githubusercontent.com/KnockOutEZ/wigolo/star-chart/star-history-dark.svg&#34;&gt;
&lt;img alt=&#34;wigolo GitHub stars over time&#34; src=&#34;https://raw.githubusercontent.com/KnockOutEZ/wigolo/star-chart/star-history.svg&#34; width=&#34;880&#34;&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;p&gt;&lt;sub&gt;Refreshed daily from the GitHub API. &lt;a href=&#34;https://github.com/KnockOutEZ/wigolo&#34;&gt;Add a ⭐&lt;/a&gt; if wigolo is useful to you.&lt;/sub&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture
&lt;/h2&gt;&lt;p&gt;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&amp;rsquo;t using.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    A[&amp;#34;🤖 AI agent&amp;lt;br/&amp;gt;any MCP client · REST · SDK&amp;#34;]
    A --&amp;gt;|MCP over stdio| B[&amp;#34;&amp;lt;b&amp;gt;wigolo&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;10 tools · dynamic instructions&amp;lt;br/&amp;gt;in-process browser pool + cache + models&amp;#34;]

    B --&amp;gt; C{&amp;#34;Tool layer&amp;#34;}
    C --&amp;gt; T1[&amp;#34;search · fetch · crawl · extract&amp;#34;]
    C --&amp;gt; T2[&amp;#34;cache · find_similar · research · agent&amp;#34;]

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

    F -.-&amp;gt;|optional| LLM[&amp;#34;☁️ LLM&amp;lt;br/&amp;gt;synthesis only · opt-in&amp;#34;]
    S -.-&amp;gt;|optional| SX[&amp;#34;🔀 Aggregator backend&amp;lt;br/&amp;gt;opt-in legacy / hybrid&amp;#34;]

    F --&amp;gt; WEB[&amp;#34;🌍 Public web&amp;#34;]
    S --&amp;gt; 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
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Code beats model.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signal-driven routing.&lt;/strong&gt; 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 &lt;code&gt;wigolo tune list&lt;/code&gt; shows you exactly what it learned.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reads pages the way a browser does.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration
&lt;/h2&gt;&lt;p&gt;A clean install works out of the box. Three settings raise output quality:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. Synthesis — the biggest lever (research / agent / search-answer write real prose)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;WIGOLO_LLM_PROVIDER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gemini                   &lt;span class=&#34;c1&#34;&gt;# or anthropic / openai / groq / ollama (keyless)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;lt;your-key&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. Wider retrieval funnel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;WIGOLO_SEARCH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;hybrid                         &lt;span class=&#34;c1&#34;&gt;# core engines + aggregator fallback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;WIGOLO_GITHUB_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;...                      &lt;span class=&#34;c1&#34;&gt;# GitHub code search 10 → 30 req/min&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. Land more fetches, stay warm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;WIGOLO_TLS_TIER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;auto                         &lt;span class=&#34;c1&#34;&gt;# per-domain learned fetch hardening&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;WIGOLO_EAGER_WARMUP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;                        &lt;span class=&#34;c1&#34;&gt;# pay the ~1s model load up front&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Per-call habits that pay off:&lt;/strong&gt; query &lt;strong&gt;arrays&lt;/strong&gt; (&lt;code&gt;[&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;]&lt;/code&gt;) for parallel breadth · &lt;code&gt;search_depth: &amp;quot;deep&amp;quot;&lt;/code&gt; for queries that matter · &lt;code&gt;include_domains&lt;/code&gt; 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&amp;rsquo;s in the &lt;a class=&#34;link&#34; href=&#34;docs/configuration.md&#34; &gt;configuration guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;docs--examples&#34;&gt;Docs &amp;amp; examples
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;docs/README.md&#34; &gt;docs/&lt;/a&gt;&lt;/strong&gt; — the complete manual:
&lt;a class=&#34;link&#34; href=&#34;docs/getting-started.md&#34; &gt;getting started&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/installation.md&#34; &gt;installation &amp;amp; channels&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/configuration.md&#34; &gt;configuration&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/tools.md&#34; &gt;tools reference&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/cli.md&#34; &gt;CLI &amp;amp; shell&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/rest-api.md&#34; &gt;REST API&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/sdks.md&#34; &gt;SDKs &amp;amp; integrations&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/self-hosting.md&#34; &gt;self-hosting&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/skills.md&#34; &gt;agent skills&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/plugins.md&#34; &gt;plugins&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/troubleshooting.md&#34; &gt;troubleshooting &amp;amp; FAQ&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;docs/privacy-security.md&#34; &gt;privacy &amp;amp; security&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;examples/README.md&#34; &gt;examples/&lt;/a&gt;&lt;/strong&gt; — runnable, each with a README (and most with a terminal recording): one-shot CLI, NDJSON shell pipelines, REST via curl, TypeScript &amp;amp; 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 &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://knockoutez.github.io/wigolo/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;knockoutez.github.io/wigolo/docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;beta--feedback&#34;&gt;Beta &amp;amp; feedback
&lt;/h2&gt;&lt;p&gt;wigolo is in &lt;strong&gt;public beta&lt;/strong&gt;. Everything documented here works and is held to a 7,600-test suite; it&amp;rsquo;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🐛 &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/KnockOutEZ/wigolo/issues/new?template=bug_report.yml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Report a bug&lt;/a&gt;&lt;/strong&gt; — broke, misbehaved, surprised you&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/KnockOutEZ/wigolo/issues/new?template=feature_request.yml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Request a feature&lt;/a&gt;&lt;/strong&gt; — something it should do&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/KnockOutEZ/wigolo/discussions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ask anything&lt;/a&gt;&lt;/strong&gt; — questions, setups, show &amp;amp; tell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If wigolo earns a place in your setup, three things keep it going: a ⭐ &lt;strong&gt;star&lt;/strong&gt; (it&amp;rsquo;s how open source gets found), a &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://buymeacoffee.com/knockoutez&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;☕ coffee&lt;/a&gt;&lt;/strong&gt; (there&amp;rsquo;s no paid tier and never will be), or &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;mailto:ktowhid20@gmail.com&#34; &gt;an email&lt;/a&gt;&lt;/strong&gt; that goes straight to the one developer who wrote the code.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;wigolo doctor&lt;/code&gt; names any broken component and the exact env var or command that fixes it; &lt;code&gt;wigolo doctor --fix&lt;/code&gt; repairs the common cases, and &lt;code&gt;wigolo verify&lt;/code&gt; health-checks every component. A component failing during &lt;code&gt;init&lt;/code&gt; doesn&amp;rsquo;t break wigolo: &lt;code&gt;init&lt;/code&gt; still exits 0, and core search / fetch / crawl / extract / cache work with no models and no browser. Quick hits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Slow or failed downloads&lt;/strong&gt; — re-run &lt;code&gt;wigolo warmup --all&lt;/code&gt; (or &lt;code&gt;--browser&lt;/code&gt; / &lt;code&gt;--embeddings&lt;/code&gt; / &lt;code&gt;--reranker&lt;/code&gt;); they resume and retry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser won&amp;rsquo;t launch on Linux&lt;/strong&gt; — &lt;code&gt;wigolo warmup --browser&lt;/code&gt; installs the OS libraries (or prints the exact command).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native build error / unusual Node&lt;/strong&gt; — use an LTS: &lt;strong&gt;Node 20, 22, or 24&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behind a proxy&lt;/strong&gt; — &lt;code&gt;USE_PROXY=true&lt;/code&gt; + &lt;code&gt;PROXY_URL&lt;/code&gt;; add &lt;code&gt;NODE_EXTRA_CA_CERTS&lt;/code&gt; for TLS-inspecting proxies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full guide covers per-symptom fixes, a &amp;ldquo;what still works when X fails&amp;rdquo; map, platform notes (incl. linux-arm64), and offline installs: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;docs/troubleshooting.md&#34; &gt;docs/troubleshooting.md&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;faq&#34;&gt;FAQ
&lt;/h2&gt;&lt;details&gt;
&lt;summary&gt;&lt;b&gt;Free? What&#39;s the catch?&lt;/b&gt;&lt;/summary&gt;
&lt;p&gt;No catch by design. The expensive parts (ranking, embeddings, the browser engine) run on &lt;em&gt;your&lt;/em&gt; hardware, so there&amp;rsquo;s no per-query cost to recover and no reason for a meter. It&amp;rsquo;s sustained by donations, and the AGPL license legally prevents a switch into a closed hosted product.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;b&gt;Is the quality really on par with the paid services?&lt;/b&gt;&lt;/summary&gt;
&lt;p&gt;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&amp;rsquo;t have to take anyone&amp;rsquo;s word for it.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;b&gt;Won&#39;t public search engines block or rot?&lt;/b&gt;&lt;/summary&gt;
&lt;p&gt;It&amp;rsquo;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 &lt;em&gt;reported in the output&lt;/em&gt;, and the local cache means everything already seen keeps working regardless.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;b&gt;Is this kind of scraping OK?&lt;/b&gt;&lt;/summary&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;b&gt;AGPL — can I use this at work?&lt;/b&gt;&lt;/summary&gt;
&lt;p&gt;Yes, freely, company-wide. The license only bites if you &lt;em&gt;modify wigolo and run it as a network service&lt;/em&gt;, in which case you must publish those modifications; using it as a local dev tool carries zero obligation. For commercial-licensing questions, reach out.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;b&gt;Why 1.5 GB of disk?&lt;/b&gt;&lt;/summary&gt;
&lt;p&gt;That&amp;rsquo;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&amp;rsquo;s on disk, every query uses it for free.&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&#34;available-on&#34;&gt;Available on
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;npm&lt;/strong&gt; — &lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;wigolo&lt;/code&gt;&lt;/a&gt; &lt;em&gt;(primary channel — the Quickstart above)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyPI&lt;/strong&gt; — &lt;a class=&#34;link&#34; href=&#34;https://pypi.org/project/wigolo/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;wigolo&lt;/code&gt;&lt;/a&gt; &lt;em&gt;(Python SDK)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt; — &lt;a class=&#34;link&#34; href=&#34;https://github.com/KnockOutEZ/wigolo/pkgs/container/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;ghcr.io/knockoutez/wigolo&lt;/code&gt;&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/r/towhid69420/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;towhid69420/wigolo&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Official MCP Registry&lt;/strong&gt; — &lt;code&gt;io.github.KnockOutEZ/wigolo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Directories&lt;/strong&gt; — &lt;a class=&#34;link&#34; href=&#34;https://glama.ai/mcp/servers/KnockOutEZ/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Glama&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;https://smithery.ai/server/ktowhid20/wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Smithery&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;https://mcp.so/server/wigolo/KnockOutEZ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mcp.so&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;https://lobehub.com/mcp/knockoutez-wigolo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LobeHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Homebrew, &lt;code&gt;curl | sh&lt;/code&gt;, and the single-file binary are covered in the &lt;a class=&#34;link&#34; href=&#34;docs/installation.md&#34; &gt;installation guide&lt;/a&gt;. Use one channel per machine; they all share &lt;code&gt;~/.wigolo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;contributing&#34;&gt;Contributing
&lt;/h2&gt;&lt;p&gt;Bug reports, feature requests, and PRs are all welcome; see &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;CONTRIBUTING.md&#34; &gt;CONTRIBUTING.md&lt;/a&gt;&lt;/strong&gt;. 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: &lt;a class=&#34;link&#34; href=&#34;docs/plugins.md&#34; &gt;add a search engine in ~100 lines&lt;/a&gt;, with a template in &lt;a class=&#34;link&#34; href=&#34;examples/plugin-search-engine&#34; &gt;&lt;code&gt;examples/plugin-search-engine&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;license&#34;&gt;License
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;LICENSE&#34; &gt;GNU AGPL-3.0-only&lt;/a&gt;.&lt;/strong&gt; Free to use, modify, and self-host, including inside a company. The one obligation: if you run a &lt;strong&gt;modified&lt;/strong&gt; 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 &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;SECURITY.md&#34; &gt;SECURITY.md&lt;/a&gt;&lt;/strong&gt; to report a vulnerability and &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;TRADEMARK.md&#34; &gt;TRADEMARK.md&lt;/a&gt;&lt;/strong&gt; for use of the name. For commercial-licensing questions, reach out.&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;br&gt;
&lt;p&gt;wigolo is free and actively maintained, and it&amp;rsquo;s meant to stay that way.
If it saves you a metered search bill, a ⭐, a sharp issue, or a &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://buymeacoffee.com/knockoutez&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;☕ coffee&lt;/a&gt;&lt;/strong&gt; helps keep it sustainable.&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;Built and maintained by &lt;a href=&#34;https://github.com/KnockOutEZ&#34;&gt;@KnockOutEZ&lt;/a&gt; · &lt;a href=&#34;mailto:ktowhid20@gmail.com&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;mailto:ktowhid20@gmail.com&#34; &gt;ktowhid20@gmail.com&lt;/a&gt;&lt;/a&gt; · &lt;a href=&#34;https://x.com/yourtowhid&#34;&gt;X&lt;/a&gt; · &lt;a href=&#34;https://www.linkedin.com/in/yourtowhid/&#34;&gt;LinkedIn&lt;/a&gt;&lt;/sub&gt;&lt;/p&gt;
&lt;/div&gt;
</description>
        </item>
        
    </channel>
</rss>
