pi-web-toolkit
Web research toolkit for the pi coding agent. Search via SearXNG, fetch pages with scrapling, browse interactively via agent-browser, batch-read sources in parallel, and optionally fall back to Firecrawl Keyless (no API key) when a local backend fails.
Package details
Install pi-web-toolkit from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-web-toolkit- Package
pi-web-toolkit- Version
0.3.3- Published
- Jun 30, 2026
- Downloads
- 1,327/mo · 282/wk
- Author
- wade11s
- License
- MIT
- Types
- extension
- Size
- 3.5 MB
- Dependencies
- 0 dependencies · 4 peers
Pi manifest JSON
{
"extensions": [
"./extensions/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-web-toolkit
Local-first & 100% open-source. No required API keys or paid services.
Web research toolkit for pi agents. Search via SearXNG, fetch pages with scrapling, browse interactively via agent-browser, and batch-read sources in parallel. All primary backends run locally or are self-hosted, with an optional Firecrawl Keyless cloud fallback (no API key, no signup) so the local tools keep working when a backend is missing or fails. Built-in truncation safety and LLM-optimized prompt guidelines throughout.
Features
| Tool | Backend | Purpose | Current Limit |
|---|---|---|---|
web_search |
SearXNG | Discover scored, ranked results from multiple engines | 20 results (max 60, auto-pages up to 3 pages) |
web_fetch |
scrapling | Fetch a single page as clean markdown | — |
web_batch_fetch |
scrapling | Fetch 1–15 pages in parallel for research synthesis (2–5 recommended) | 3 concurrent (max 5) |
web_browse |
agent-browser | Interact with a page (click, scroll, fill) then extract content | 25 actions |
firecrawl_search |
firecrawl-cli (keyless) | Cloud search with sources/categories/domain filters | — |
firecrawl_scrape |
firecrawl-cli (keyless) | Cloud single-page fetch (anti-bot / JS / PDF) | — |
firecrawl_interact |
firecrawl-cli (keyless) | Cloud natural-language page interaction | — |
Firecrawl fallback.
web_search,web_fetch, andweb_browseare the local-first primary tools and automatically retry through Firecrawl Keyless (1,000 free credits/month, no API key) only when their local backend errors out or search returns nothing. The threefirecrawl_*tools are fallback-only escape hatches; agents are instructed not to call them first unless you explicitly ask for Firecrawl/cloud behavior or a local-first tool already failed. Disable fallback use withPI_WEB_FIRECRAWL_FALLBACK=0or toolkit config"firecrawlFallback": false. Install the optional CLI:npm install -g firecrawl-cli.
Tools Preview
A quick look at how pi renders toolkit calls while an agent searches, fetches, batches, and browses the web.
Quick Start
Install
Run the bootstrap installer:
curl -fsSL https://raw.githubusercontent.com/Wade11s/pi-web-toolkit/main/install.sh | bash
This is the normal install path. It installs the pi package, configures external runtime dependencies, verifies everything, and writes persistent runtime options to ${XDG_CONFIG_HOME:-~/.config}/pi-web-toolkit/config.json.
When it finishes, restart pi so the package is loaded. If pi-web-toolkit was already loaded and only toolkit config changed, /reload may also work.
What the installer does
The installer:
- Checks Node.js 22+, npm, Pi, curl, OpenSSL, and uv.
- Installs or reuses Scrapling and agent-browser.
- Configures a JSON-capable SearXNG endpoint for
web_search. - Optionally installs
firecrawl-clifor the Firecrawl Keyless fallback. - Writes toolkit config with the selected endpoint and discovered CLI paths.
- Installs the pi package with
pi install npm:pi-web-toolkit. - Runs final verification before reporting success.
The installer is conservative. It does not silently install Docker, Node.js, Pi, Homebrew, OS packages, use sudo, change shell profiles, or overwrite user-managed SearXNG resources.
Common installer options
When piping from curl, pass flags after bash -s --:
curl -fsSL https://raw.githubusercontent.com/Wade11s/pi-web-toolkit/main/install.sh | bash -s -- --yes --searxng-url https://searxng.example.com --no-firecrawl
If you have cloned the repo, run the same flags directly:
| Goal | Command |
|---|---|
| Use an existing/self-hosted SearXNG endpoint | ./install.sh --searxng-url https://searxng.example.com |
| Non-interactive install with a known endpoint | ./install.sh --yes --searxng-url https://searxng.example.com --no-firecrawl |
| Explicitly auto-select a verified public SearXNG endpoint | ./install.sh --yes --auto-searxng public --no-firecrawl |
| Start/reuse isolated local Docker SearXNG | ./install.sh --yes --auto-searxng local-docker --searxng-port 8080 --no-firecrawl |
| Install optional Firecrawl Keyless fallback with global CLI | ./install.sh --with-firecrawl --firecrawl-runner installed |
Enable Firecrawl fallback through opt-in npx runner |
./install.sh --with-firecrawl --firecrawl-runner npx |
Enable Firecrawl fallback through opt-in bunx runner |
./install.sh --with-firecrawl --firecrawl-runner bunx |
| Verify readiness without changing anything | ./install.sh --doctor |
| Install from the current checkout | ./install.sh --local |
SearXNG endpoint choices
web_search needs a SearXNG endpoint that supports JSON search responses:
curl -fsS --get "https://searxng.example.com/search" \
--data-urlencode "q=searxng" \
--data "format=json" | grep -q '"results"'
The installer can use:
- An existing/self-hosted endpoint passed with
--searxng-url. - A working local endpoint such as
http://localhost:8080. - A public endpoint discovered from
searx.space, ranked by health signals, then verified withformat=json. - An isolated local Docker endpoint using container
pi-web-toolkit-searxngand config under the toolkit config directory.
Public endpoints are not silently selected by default because search queries leave your machine. Use --auto-searxng public only when that trade-off is acceptable.
Manual install (advanced)
If you prefer to install dependencies yourself:
# SearXNG endpoint: provide an existing JSON-capable endpoint, or run your own
export SEARXNG_URL="https://searxng.example.com"
# scrapling (for fetch & batch fetch)
uv tool install "scrapling[all]"
scrapling install
# agent-browser (for browse)
npm i -g agent-browser
agent-browser install
agent-browser doctor
# firecrawl-cli (optional cloud fallback; no API key needed)
npm i -g firecrawl-cli
# pi package
pi install npm:pi-web-toolkit
A SearXNG endpoint must support format=json:
curl -fsS --get "$SEARXNG_URL/search" \
--data-urlencode "q=searxng" \
--data "format=json" | grep -q '"results"'
Configuration
Runtime configuration is resolved in this order: environment variables first, then the toolkit config file written by the installer, then built-in defaults. No build step is required.
Default toolkit config path:
${XDG_CONFIG_HOME:-~/.config}/pi-web-toolkit/config.json
Example:
{
"searxngUrl": "https://searxng.example.com",
"firecrawlFallback": false,
"firecrawlRunner": "installed",
"commands": {
"scrapling": "/Users/alice/.local/bin/scrapling",
"agentBrowser": "/Users/alice/.npm-global/bin/agent-browser",
"firecrawl": "/Users/alice/.npm-global/bin/firecrawl"
}
}
| Variable | Toolkit config key | Default | Used By | Description |
|---|---|---|---|---|
SEARXNG_URL |
searxngUrl |
http://localhost:8080 |
web_search |
SearXNG endpoint. Must support /search?q=...&format=json. |
PI_WEB_FIRECRAWL_FALLBACK |
firecrawlFallback |
true |
all Firecrawl fallback paths | Set env to 0/false/no/off, or config to false, to disable cloud fallback. |
PI_WEB_FIRECRAWL_RUNNER |
firecrawlRunner |
installed |
all Firecrawl fallback paths | Firecrawl runner: installed, npx, or bunx. npx/bunx are opt-in because they may run or download packages at fallback time. |
SCRAPLING_BIN |
commands.scrapling |
scrapling |
web_fetch, web_batch_fetch |
Scrapling executable path. |
AGENT_BROWSER_BIN |
commands.agentBrowser |
agent-browser |
web_browse |
agent-browser executable path. |
FIRECRAWL_BIN |
commands.firecrawl |
firecrawl |
firecrawl_*, fallback paths |
Firecrawl CLI executable path. |
PI_WEB_TOOLKIT_CONFIG |
— | ${XDG_CONFIG_HOME:-~/.config}/pi-web-toolkit/config.json |
all tools | Override the toolkit config file location. |
Set env vars before starting pi when you need a temporary override:
export SEARXNG_URL="https://searxng.example.com"
export SCRAPLING_BIN="$HOME/.local/bin/scrapling"
export PI_WEB_FIRECRAWL_FALLBACK=0
export PI_WEB_FIRECRAWL_RUNNER=npx
Optional: Firecrawl keyless fallback
When a local backend (web_search/web_fetch/web_browse) fails or returns nothing, the tools automatically retry through Firecrawl Keyless — 1,000 free credits/month, no API key, no signup. The firecrawl_* tools are fallback-only explicit escape hatches for capabilities the local backends lack (search categories, cloud rendering, natural-language interaction). Agents should use web_fetch/web_search/web_browse first unless you explicitly request Firecrawl/cloud behavior.
Install the optional CLI (the fallback degrades gracefully if it is absent):
npm install -g firecrawl-cli
Alternatively, opt into a runner that executes the official CLI on demand:
{ "firecrawlRunner": "npx" }
Allowed runners are installed, npx, and bunx. The default is installed; npx and bunx are never selected automatically because they may run or download packages at fallback time.
The fallback is keyless-only: it never reads or stores an API key, and spawns the CLI under an isolated temporary HOME with the key env stripped. Privacy: when the fallback runs, the URL and page content are sent to Firecrawl's cloud.
Troubleshooting
Run doctor mode when an install fails, when filing an issue, or when you want to verify an existing setup. It is verify-only: it does not install dependencies, write config, start containers, or run pi install.
./install.sh --doctor
# or, without cloning:
curl -fsSL https://raw.githubusercontent.com/Wade11s/pi-web-toolkit/main/install.sh | bash -s -- --doctor
Common failures:
| Symptom | Fix |
|---|---|
| Node.js is too old | Install Node.js 22+ and retry. |
uv is missing |
Install uv, then rerun the installer. |
| SearXNG returns HTML/403 instead of JSON | Use another endpoint or enable search.formats: json on your SearXNG instance. |
| Docker local SearXNG fails | Start Docker first, or use --searxng-url / --auto-searxng public. |
agent-browser doctor fails on Linux |
Rerun with --agent-browser-with-deps or install the missing browser system libraries manually. |
| Firecrawl fallback says runner missing | Install firecrawl-cli, choose --firecrawl-runner npx, choose --firecrawl-runner bunx, or disable fallback with --no-firecrawl. |
| pi does not show the tools after install | Restart pi. |
To remove the pi package, run pi remove npm:pi-web-toolkit. To remove the toolkit config, delete ${XDG_CONFIG_HOME:-~/.config}/pi-web-toolkit/config.json. If the installer created local SearXNG, remove container pi-web-toolkit-searxng and the toolkit SearXNG config directory manually.
Project Structure
pi-web-toolkit/
├── extensions/
│ ├── index.ts # Unified entry point — registers all 7 tools (4 local + 3 Firecrawl keyless)
│ ├── utils/
│ │ ├── cli-runner.ts # Unified CLI process spawning with timeout/AbortSignal/env
│ │ ├── config.ts # Toolkit config and external CLI path resolution
│ │ ├── content-preview.ts # Intelligent content extraction from scraped pages
│ │ ├── output-sink.ts # Truncation + temp-file fallback
│ │ ├── render-helpers.ts # URL abbreviations, text normalization, error formatting for TUI
│ │ ├── scrapling.ts # Reusable scrapling CLI wrapper (shared by fetch + batch)
│ │ ├── tool-factory.ts # Common tool registration patterns
│ │ ├── agent-browser.ts # agent-browser CLI wrapper (shared by web_browse)
│ │ └── firecrawl.ts # Firecrawl keyless CLI wrapper + fallback decisions (shared by firecrawl_* tools + fallbacks)
│ ├── web_search.ts # SearXNG search tool (+ Firecrawl fallback)
│ ├── web_fetch.ts # Single-page scrapling fetcher (+ Firecrawl fallback)
│ ├── web_batch_fetch.ts # Parallel scrapling fetcher
│ ├── web_browse.ts # Interactive browser automation (agent-browser + Firecrawl fallback)
│ ├── firecrawl_search.ts # Firecrawl keyless search (escape hatch)
│ ├── firecrawl_scrape.ts # Firecrawl keyless single-page fetch (escape hatch)
│ └── firecrawl_interact.ts # Firecrawl keyless natural-language interaction (escape hatch)
├── test/
│ ├── agent-browser/ # agent-browser output parser regression tests
│ ├── config/ # Toolkit config precedence tests
│ ├── content-preview/ # Content preview fixtures, baselines & snapshots
│ ├── installer/ # Bootstrap installer behavior tests
│ ├── web-search/ # SearXNG-first fallback behavior tests
│ └── README.md # Test suite structure and conventions
├── docs/
│ ├── tools.md # Full parameter specs
│ ├── guide.md # Decision tree & tool comparison
│ └── agents/ # Issue tracker, triage and domain guidance
├── AGENTS.md
├── CONTEXT.md
├── CHANGELOG.md
├── install.sh
├── package.json
├── README.md
├── tsconfig.json
└── LICENSE
Design principles:
- Unified registration —
index.tsis the single source of truth for what pi loads. - Shared utilities —
utils/modules encapsulate CLI spawning, content extraction, output truncation, TUI formatting, and common registration patterns; tool files import only fromutils/, never from each other. - Per-tool isolation — each tool owns its own schema, execute logic, and TUI renderer; no cross-imports except via
utils/. - Runtime config — environment variables and toolkit config are read at execute time, not build time.
Reference
- Tool Reference — Full parameter specs and usage examples for each tool.
- Usage Guide — Decision tree and tool comparison.
- Changelog — Release history and migration notes.
Contributing
# Local development
pi install ./
# Type-check (no build step; pi loads TypeScript directly)
npm run typecheck
# Run tests
npm run test
# Verify external CLI dependencies
scrapling --help
agent-browser doctor
Pull requests welcome. Please keep changes scoped to a single tool or concern and follow Conventional Commits.
License
MIT