Copy of the legacy ~/.pi/agent/docs tree rebuilt as the command-center knowledge base: concept files promoted to path identity, index listings stripped of frontmatter, all wikilinks/relative links resolved, every checkable claim verified against the live fleet (Dankserver = Ryzen 7 7700X + RTX 3090; Strix Halo is Dankclaw), unverifiable claims tagged. kb-lint exits 0.
4.5 KiB
type, title, description, tags, timestamp
| type | title | description | tags | timestamp | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| reference | Pi Web Access | Web search, URL fetching, GitHub cloning, PDF extraction, and video understanding for Pi. Zero-config with Exa MCP. |
|
2026-08-28 |
Pi Web Access
Package: pi-web-access
Version: 0.22.0
Author: Nico Bailon
Web search, content extraction, and video understanding for Pi. It calls your self-hosted SearXNG first when one is configured, and falls through to other providers.
Active setup:
~/.pi/web-search.jsonlocks search to SearXNG athttp://192.168.0.143:8081(dankclaw), permits LAN fetches viassrf.allowRanges, and setsmaxInlineContentCharsto 50000. The config file is cached in memory per process — a changed file takes effect on the next Pi session.
Install
pi install npm:pi-web-access
Search Providers
Provider chain (in priority order, v0.22):
- SearXNG (if configured) — Self-hosted, private search
- OpenAI — Codex subscription or API key
- Exa — Zero-config via MCP, or API key
- Brave — API key
- Parallel — API key
- TinyFish — API key
- Search1API — API key
- Searchinfinity — API key
- Querit — API key
- Tavily — API key
- Jina — API key
- SERPdive — API key
- Kagi — API key
- Bocha — API key
- Ollama — API key
- Perplexity — API key
- Gemini API — API key
- Gemini Web — Browser-cookie access
A single-provider field (provider or searchProvider) pins the default and takes precedence over searchRouting. searchRouting.providers plus fallbackOn define an explicit ordered fallback over typed failures (transient, quota, network, invalid-response).
Configuration
Location: ~/.pi/web-search.json
{
"searxngBaseUrl": "http://192.168.0.143:8081",
"searchProvider": "searxng",
"maxInlineContentChars": 50000,
"workflow": "none",
"ssrf": {
"allowRanges": ["192.168.0.0/24"]
},
"openaiApiKey": "sk-...",
"braveApiKey": "BSA_...",
"exaApiKey": "exa-...",
"perplexityApiKey": "pplx-...",
"geminiApiKey": "AIza..."
}
Key fields:
searxngBaseUrl— the SearXNG instance to call. EnvSEARXNG_BASE_URLwins over this file. The client callsGET {base}/search?q=...&format=jsonwith a 30 s timeout; the base URL and its redirects stay subject to the SSRF guard.searchProvider—searxnglocks the primary provider.autopicks the first available. A single-provider field wins oversearchRouting.maxInlineContentChars— size of eachfetch_content/get_search_contentcontent slice. Default 30000, cap 200000. Full fetched content stays stored for later retrieval.ssrf.allowRanges— LAN CIDR ranges allowed throughfetch_content. This blocks private IPs by default.workflow—none(raw results, no browser),summary-review(curator window with summary draft), orauto-summary.
Capabilities
Web Search
web_search({ query: "TypeScript best practices 2025" })
URL Fetching
fetch_content({ url: "https://docs.example.com/guide" })
GitHub Cloning
GitHub URLs are cloned locally. The agent gets real file contents, not rendered HTML.
fetch_content({ url: "https://github.com/owner/repo" })
Video Understanding
Point at a YouTube video or local screen recording and ask questions about visual content.
// YouTube
fetch_content({ url: "https://youtube.com/watch?v=...", prompt: "What book is shown?" })
// Local video
fetch_content({ url: "/path/to/recording.mp4" })
PDF Extraction
fetch_content({ url: "https://example.com/paper.pdf" })
Optional Dependencies
# Video frame extraction
sudo pacman -S ffmpeg yt-dlp
Without these, video analysis (transcripts, visual descriptions via Gemini) still works. Frame extraction requires ffmpeg and yt-dlp. Both are installed on dankware (verified 2026-08-28: ffmpeg n9.0.1, yt-dlp 2026.08.19).
GitHub URLs get special handling: fetch_content clones the repo locally instead of scraping HTML (root URL returns tree + README, /blob/ returns file contents). Repos over 350 MB get an API-based view; forceClone: true overrides. Clones cache per session under /tmp/pi-github-repos and wipe on session change. Private repos need the gh CLI. Disable with githubClone.enabled: false.
See Also
- Pi Packages — Package overview
- Pi Configuration — Pi configuration