Agent Reach: Internet Access Without the API Bill
TL;DR
- What it solves: Your coding agent can refactor a repo in minutes, then fail completely when you ask it to read a tweet, a Reddit thread, or a Bilibili video. Each platform wants a different tool, login method, and workaround.
- Why it matters: Without a stable routing layer, you re-discover the same dead ends every month - yt-dlp blocked on Bilibili, Reddit 403, Twitter API invoices.
- Best for: Developers running Claude Code, Cursor, OpenClaw, or any agent that can execute shell commands and needs live internet reads, not stale training data.
- Main differentiator: It does not scrape itself. It installs upstream CLIs (twitter-cli, yt-dlp, bili-cli, gh, Jina Reader), registers a skill file, and runs
agent-reach doctorso you know which backend is alive today. - Usecase example: Paste one install URL into your agent. Ten minutes later it can summarize a YouTube tutorial, search Bilibili for an AI course, and read a GitHub issue thread - without you touching pipx, commit hashes.
I asked Claude to summarize a YouTube tutorial. It wrote three confident paragraphs about a library I had never heard of.
I opened the link. The video was about deployment. The library did not appear once.
The agent had not watched anything. It had guessed from the URL shape. Same story when I asked about a Reddit thread on a production bug: 403, then a polite apology, then a fabricated summary anyway.
The intelligence was not the problem. The agent simply had no eyes.
--> // making it invisible to querySelectorAll. // // `data-cfasync="false"` keeps this rescue script executable even when // Rocket Loader is active. It rescues module scripts via two strategies: // 1. Query the DOM for type$="-module" + src (covers case A) // 2. Regex-parse the raw HTML for commented-out script tags (covers case B) // Dynamically-created scripts bypass Rocket Loader entirely. (function () { if (window.__markdyRescue) return; window.__markdyRescue = true; var rescued = false; function rescueModuleScripts() { if (rescued) return; rescued = true; var srcs = []; // Strategy 1: Rocket Loader kept the tag in DOM but changed the type. // type="module" → type="{uuid}-module" (still has src attribute) document.querySelectorAll('script[type$="-module"][src]').forEach(function (s) { srcs.push(s.src); }); // Strategy 2: Rocket Loader COMMENTED OUT the script tag entirely: // // These are invisible to querySelectorAll, so we parse the raw HTML. // We handle both attribute orderings (type-first or src-first). var html = document.documentElement.innerHTML; var reSrcFirst = //g; var reTypeFirst = //g; var m; while ((m = reSrcFirst.exec(html)) !== null) { srcs.push(m[1]); } while ((m = reTypeFirst.exec(html)) !== null) { srcs.push(m[1]); } // Re-inject each found src as a real module script. // Deduplicate first, then inject. Dynamically-created scripts bypass // Rocket Loader entirely. Modules with the same URL are only executed // once by the browser (cached), so re-injecting already-running scripts // is safe. var seen = {}; srcs.forEach(function (src) { if (seen[src]) return; seen[src] = true; var fix = document.createElement('script'); fix.type = 'module'; fix.src = src; fix.setAttribute('data-cfasync', 'false'); document.head.appendChild(fix); }); } // Rescue when user clicks the placeholder (fallback if autoplay failed). document.addEventListener('click', function (e) { var t = e.target; if (t && typeof t.closest === 'function' && t.closest('.markdy-placeholder')) { rescueModuleScripts(); } }); // Rescue automatically after a short delay for autoplay. // Only fires if initAll() never ran (no data-markdy-init on any root). setTimeout(function () { if (document.querySelector('.markdy-root:not([data-markdy-init])')) { rescueModuleScripts(); } }, 1500); }());What Agent Reach Actually Is
Agent Reach picks, installs, and health-checks the best free CLI for each platform so your coding agent can read the live web without you wiring twelve tools by hand.
Panniantong/Agent-Reach is a Python CLI plus a bundle of channel modules. Not a monolithic scraper. Not an MCP server that wraps everything in one opaque API.
Physically, it is:
pip install agent-reachto get the command- A
channels/folder where each platform file lists primary and fallback backends - A
SKILL.mddropped into your agent’s skills directory so it knows which upstream tool to call ~/.agent-reach/config.yamlfor cookies and tokens that never leave your machine
The README’s entire onboarding is one sentence you paste to your agent:
帮我安装 Agent Reach:https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
(English speakers can say “Install Agent Reach from that URL” - the agent reads the doc and runs the rest.)
That is the product. Everything else is maintenance so the sentence keeps working when platforms move the goalposts.
💡 Tip: You do not run the install yourself. Paste the doc URL into Claude Code, Cursor, or OpenClaw and let the agent execute
pip install, registerSKILL.md, and run the firstdoctorpass. Your job is approving shell commands, not memorizing channel files.
The Mental Model: Cable Guy, Not Camera
Picture two setups for getting TV in a new apartment.
One roommate buys a smart TV, assumes Wi‑Fi is Wi‑Fi, and spends Saturday clicking through apps that half-load. The other calls the cable guy once. The cable guy does not film the shows. He runs the wire, tests the signal on every jack, and leaves a note on the fridge: “Living room: HDMI 2. Sports package: channel 204.”
Agent Reach is the cable guy for your agent’s internet access.
It does not read Twitter. twitter-cli reads Twitter. It does not pull YouTube subtitles. yt-dlp does. Agent Reach picks which tool is working this week, installs it, registers the skill, and tells you when the wire goes dead.
When Bilibili killed yt-dlp with 412 errors in June 2026, the project rerouted to bili-cli without users reinstalling anything. That is the whole design bet: backends rot fast; routing should not.
How the Router Works
Each platform is an ordered list. The doctor command probes real connectivity, not just which twitter.
You ask the agent
│
▼
SKILL.md (which tool for which URL?)
│
▼
channels/twitter.py → twitter-cli ✓ | OpenCLI ✗ | bird ✗
channels/bilibili.py → bili-cli ✓ | OpenCLI ✗ | search API ✗
channels/youtube.py → yt-dlp ✓
channels/web.py → Jina Reader ✓
│
▼
Agent runs the winning upstream CLI directly
No wrapper layer in the middle. The agent calls yt-dlp, gh repo view, or curl https://r.jina.ai/URL like a human would - just with instructions filed in advance.
The Smallest Useful Commands
Health check everything after install:
# One command: which platforms work, which backend won, how to fix the rest
agent-reach doctor
👁️ Agent Reach Status
========================================
✅ Ready to use:
✅ Web pages · Jina Reader
✅ YouTube subtitles · yt-dlp
✅ Bilibili search · bili-cli
✅ GitHub public repos · gh CLI
⚠️ Needs setup:
⚠️ Reddit · tell your agent "help me set up Reddit"
⚠️ Twitter search · export cookie via Cookie-Editor
Preview install without touching your system:
agent-reach install --env=auto --dry-run
The README’s zero-config wins are boring on purpose - boring is reliable:
| You ask | What runs | Config needed |
|---|---|---|
| ”What does this webpage say?” | Jina Reader via curl https://r.jina.ai/URL | None |
| ”Summarize this YouTube video” | yt-dlp subtitle dump | None |
| ”Search Bilibili for Rust tutorials” | bili-cli | None |
| ”What’s in this public GitHub repo?“ | gh CLI | None |
| ”Search the web for LLM benchmarks” | Exa via mcporter MCP | Auto, no API key in docs |
Twitter search, Reddit threads, Xiaohongshu notes - those sit behind login. The install flow asks which extras you want, then walks cookie export through Chrome’s Cookie-Editor extension. Credentials land in ~/.agent-reach/config.yaml with mode 600, never uploaded anywhere.
When It Shines
Three scenarios where I would reach for this before writing custom glue code.
Competitive research before you ship. You are about to launch a CLI tool. You want Reddit complaints about three competitors, Twitter reactions from the last week, and whether anyone on Bilibili already demo’d the idea. One agent session, multiple platforms, no $100/month Twitter API tier.
Digesting long-form video. A conference talk is ninety minutes. yt-dlp pulls subtitles; the agent summarizes with timestamps. You skip the intro sponsor segment without scrubbing manually.
Keeping an agent’s research honest. If the agent can actually fetch the page, it hallucinates less. Grounding beats prompting “please do not make things up” every time.
The repo crossed 32k GitHub stars in under four months - unusual for a Python installer. That usually means people hit the same wall (agent smart locally, blind globally) and shared the one-liner install prompt in Discord threads.
What’s Not Great
You are still maintaining login state. Reddit’s anonymous API is gone. Xiaohongshu and Twitter want cookies or browser sessions. Agent Reach makes the path shorter; it does not make platforms friendly.
Ban risk is real. The README warns twice about burner accounts for cookie auth. Your main X account is not the account for this experiment.
⚠️ Warning: Cookie auth platforms can lock scripted accounts. Export cookies from a burner login via Cookie-Editor, store them in
~/.agent-reach/config.yamlwith mode 600, and never paste production credentials into a shared agent session.
Server deploys need a proxy. Local laptop: fine. VPS in a region that blocks Reddit: budget ~$1/month for residential proxy or accept that some channels stay red in doctor.
This reads; it does not click. Login forms, CAPTCHAs, multi-step checkout - out of scope. The README nods to BrowserAct for “hands on the page” automation. Agent Reach stays in the read-only lane.
Vibe-coded, moving fast. The author says so openly. Expect sharp edges, rapid backend swaps, and Issue threads in Chinese and English mixed together. The architecture (one file per channel) makes local patches easy if you outgrow the defaults.
Skip It If
| Situation | Why |
|---|---|
| You only need public GitHub + docs | gh and curl already suffice |
| Your org bans cookie export | Half the value proposition disappears |
| You need guaranteed SLAs | Upstream CLIs break; this project reroutes, not contracts |
| You want one paid API instead of many free hacks | Buy Exa or Twitter Enterprise and delete the skill file |
Starting Over Without the Cable Guy
Before Agent Reach, wiring one agent for internet access looked like this:
Find twitter-cli → pipx install → cookie fails → try bird →
Reddit 403 → read a forum thread from 2024 → wrong advice →
Bilibili yt-dlp 412 → give up → agent hallucinates instead
After: paste the install doc URL, run doctor, fix whatever shows red, move on. The agent keeps the skill; you keep your Saturday.
The cable guy does not watch TV with you. He makes sure the picture comes in when you turn it on. For a coding agent that already writes better than it browses, that is the missing piece - not another model, just a wire that still works next month.
Panniantong/Agent-Reach · MIT · 32.7k
Hoang Yell
A software developer and technical storyteller. I spend my time exploring the most interesting open-source repositories on GitHub and presenting them as accessible stories for everyone.