Browse the web in tokens, not pages.

A typical page is tens of thousands of tokens of markup. The signal on it fits in a few hundred. oc fetches the page, distills it into compact text with numbered actions, and lets an agent drive the site by number.

$ npm install -g @only-cli/oc

Node 20+. Three runtime dependencies. No daemon, browser extension, or per-site adapters. Or skip the install with npx @only-cli/oc.

$ oc open news.ycombinator.com
# Hacker News
[1] Show HN: I built a tiny CSV toolkit
[2] 312 comments
...
actions: do <n> | read <n> | next | raw

$ oc do 1

1,444 tokens for four real pages, the same four cost 65,372 as raw HTML


45×

Fewer tokens than a raw HTML fetch

477

Tokens for a Reddit thread that was 52,899

500

Token budget per render, hard capped

3

Runtime dependencies, zero setup


Three ways in

Give your agent the web, cheaply

Claude Code, Codex, Cursor, Copilot, or any shell-capable agent. Pick the setup that matches how you already work; each is one line.

Install through the skills directory into Claude Code, Cursor, Codex, and Copilot. The skill costs almost no context until the agent invokes it.

$ npx skills add only-cli/oc

Prefer to do it by hand? Copy skills/only-cli/ into your agent's skills directory.


Command surface

Five commands, four flags

Small enough that an agent learns it from one --help and never asks again.

CommandWhat it doesShips
oc open <url>Fetch and render a page with numbered actionsv0.1
oc do <n>Follow the numbered link [n] from the last pagev0.2
oc find <query>Where a string appears on the page already openv0.2
oc nextThe next budget worth of the page already openv0.2
oc read <n>Full text of the region at [n]v0.2
oc raw [url]Distilled markdown of the whole pagev0.1
oc <site> <verb>Site shortcut: 'oc hn top', 'oc wiki article Berlin'; 'oc sites' lists themv0.4
oc loginSeed session cookies from stdin; 'oc logout' forgets them earlyv0.5
oc fill <n> <text>Type into a numbered inputPlanned
oc submit [n]Submit a formPlanned
Flags --budget <tokens>--json--html--session <name>--verbose Metrics are off by default, because metrics cost tokens too.

Benchmarks, measured 2026-08-19

The gap is clearest on a task with a few hops in it

Open r/ClaudeAI's front page, follow its top post to the comments, and report what the top comment argues, plus a single page, Yahoo Finance's AAPL quote. One live session per row, against each agent's own default tools.

Methodology + per-task numbers

Reddit, multi-hop

SetupAnswerTokensTurnsEst. cost
Codex + ocright112,7946$0.07
Codex defaultright301,00912$0.18
Claude Code + ocright250,6288$0.15
Claude defaultfailed196,6757$0.12

AAPL, single page

SetupAnswerTokensTurnsEst. cost
Codex + ocright59,6484$0.04
Claude defaultright123,8663$0.08
Claude Code + ocright198,9767$0.12
Codex defaultfailed71,9474$0.04

Claude Code's own WebFetch and WebSearch are blocked from reddit.com outright, and by default it has no shell to fall back to, so on the Reddit task it does not just cost more, it fails outright. Codex falls back to its own web search and curl, and gets there at 2.7× what it costs through oc. On the single AAPL page it flips: Codex's default never opens the page and reports a stale price, while Claude Code's default WebFetch is the cheapest correct answer in the table, cheaper than oc. A row marked failed didn't land a correct answer. The cost column is an estimate, not a measurement: they apply Claude Code's own measured rate on these runs (~$0.61 per 1,000 tokens, blended across input, output, and cache reads/writes) to every row's token count, including the two Codex rows, since the Codex CLI doesn't report a per-run dollar cost and its underlying model has no published price to fall back on. Treat those two as a stand-in, not gpt-5.6-sol's real pricing.


Works today

Any mostly-static site, no per-site setup

News, blogs, documentation, forums, and search engines: one generic engine distills whatever HTML comes back. Tuned shortcuts cover the sites agents hit most.

SiteShortcuts
Hacker Newstop · new · item · user
Redditsub · new · top · post · user · search
GitHubrepo · user · search · trending · issues
Stack Overflowsearch · question · tag · user · recent
Wikipediaarticle · search · lang
Xuser · post
LinkedInprofile · company · jobs
Yahoo Financequote · news · history · lookup · markets
YouTubevideo · channel
DuckDuckGosearch · lite
Bingsearch · news
AWS docsguide · page · cli · search
Google Cloud docsdocs · page · gcloud · search
Microsoft Learnazure · doc · cli · dotnet · search
Python docslibrary · doc · search
MDNjs · css · doc · search
Node.js docsapi · search
Go (pkg.go.dev)pkg · search
Rust docsstd · doc · search
Java docsapi · search
Ruby docsclass · search
PHP manualfn · doc · search
TypeScript docshandbook · search
cppreferencecpp · c · search

A site shortcut is a small JSON file; see CONTRIBUTING.md.

Known limits, honestly

What it can't do yet

Pages that only render with JavaScriptPlanned
Sites with hard bot challenges may still refuse the toolOpen

v0.5 covers static pages, budget-aware rendering, site shortcuts (including eleven language documentation sets), Atom and RSS feeds, JSON API rendering, authenticated sessions, and proxy support. Requests impersonate Chrome, or Firefox where a site prefers it, and fall back to native fetch. MIT licensed; contributions welcome.


Practising what it preaches

This site is readable by the thing it is for

Every word is in the initial HTML, with no client-side rendering and one honest heading hierarchy. There is an llms.txt for orientation, an RSS feed, a sitemap, and structured data for crawlers.

$ oc open only-cli.com
# only-cli: browse in tokens, not pages
install: npm install -g @only-cli/oc
[1] For agents: three ways in
[2] Commands: five commands, four flags
[3] Benchmarks: 1,444 vs 65,372 tokens
[4] Blog: 19 posts
actions: do <n> | raw <url>

Writing

All posts →

Stop paying for markup your agent throws away.

$ npm install -g @only-cli/oc
Star it on GitHub