Zurf
A command-line toolkit for AI agents to search the web, read pages, ask questions with citations, and retrieve video transcripts through external providers.
I built Zurf to give my agents a command-line way to read the web. A request for a static page and a request for a page that needed JavaScript were different jobs. Video content needed another service. I wanted those choices available through the same CLI.
Zurf was written in TypeScript with oclif and published as @vibemastery/zurf. The commands described the action an agent could take. It could search for a page, fetch a URL it already had, or ask a question that needed a synthesized answer.
Search used Browserbase's Exa-powered service and returned matching URLs with titles and snippets. Fetch also went through Browserbase, using its fetch service without opening a browser session. Browse opened a cloud Chromium session for pages that needed JavaScript to render.
Keeping fetch and browse separate gave the caller an explicit choice. A static page did not need a browser session. A page whose useful content appeared after JavaScript ran did. I did not need the CLI to guess which operation the agent meant.
Page content and an answer are different
The ask command used Perplexity Sonar to produce an answer with citations. That was different from fetching the content of a source page. I kept those operations separate so the caller could choose whether it needed an answer or the material to read for itself.
For video, the command was transcript. It used Supadata to retrieve captions or generate a transcript when needed. The caller could request timestamped segments or plain text. Page-reading commands returned Markdown by default, with raw HTML available, and the commands also offered JSON output for programs.
The output options mattered because a person reading in a terminal and an agent parsing a response needed different formats. I wanted either caller to choose without learning every provider's API.
What I would keep is the explicit command choice. Search results, a rendered page, and a generated answer have different uses. Putting them in one CLI was useful as long as the commands still made those differences clear.
The last repository push was in April 2026. The last release was v0.4.0 in March, and the repository remains public.