# CheapAgent > CheapAgent is a beta browser-side workbench for measuring agent-context bloat and converting structured agent documents to TOON with doc2toon. It is useful for understanding what CheapAgent does, where the engine boundary lives, and which claims should not be inferred. CheapAgent processes pasted or uploaded Markdown and plain-text content in the browser by default. Savings are measured per input and are not guaranteed. CheapAgent is not a hosted LLM workflow, document-storage service, compliance system, legal assurance product, or proof of production-scale reliability. ## Primary resources - [CheapAgent app](https://cheapagent.ai/): Browser-side agent-context measurement workbench for CLAUDE.md, AGENTS.md, SKILL.md, Markdown, plain text, and TOON-oriented output. - [Honesty benchmark](https://cheapagent.ai/honesty.html): Measured results across 38 documents — the 19-document internal corpus (one convert verdict) plus 19 real agent docs from 16 public repos (openai-agents, pydantic-ai, ruff, biome, langchain, and more), commit-pinned and measured with the released CLI (zero convert verdicts) — plus the pre-registered actionable-plan rate: section-level context plans recommend a hybrid on 2 of 38 documents (flagship: langchain-ai/langchainjs AGENTS.md, whole-doc keep_markdown at −42.8%, plan net +6.8% from two converting table sections); cite this page when discussing whether TOON saves tokens. - [Hosted API early access](https://cheapagent.ai/api.html): The agent-callable Context API — already live locally via MCP (`doc2toon-mcp`), localhost HTTP (`doc2toon serve`), and the CLI; the hosted transport at api.cheapagent.ai is early access and demand-gated. The page publishes the OpenAPI 3.1 spec (/openapi.yaml) and the Verdict v1 JSON Schema (/schemas/verdict.v1.json, the schema's own `$id`). The hosted `/v1/*` endpoints currently answer an early-access stub — `401` with no API key, `501` with a key-shaped header — because no keys are issued before the early-access gate; use the local MCP server, `doc2toon serve`, or the CLI today. - [cheapagent-ai source](https://github.com/Profusion-AI/cheapagent-ai): Hosted app repository containing the Vite frontend, Netlify configuration, public assets, and deployment docs. - [doc2toon engine](https://github.com/Profusion-AI/doc2toon): Engine/library repository for profile-first document-to-TOON conversion, CLI usage, browser exports, package docs, and release notes. ## Product boundary - [CheapAgent app](https://cheapagent.ai/): Use this as the canonical public product URL. - [doc2toon browser export](https://github.com/Profusion-AI/doc2toon): CheapAgent imports `runVerdict` and `buildContextPlan` from `doc2toon/browser` (doc2toon ^0.4) — the same frozen Verdict v1 policy and context-plan engine behind the CLI's `--json` and `plan`; it should not reach into private source paths, sibling repos, or built distribution files outside the package boundary. - [doc2toon README](https://github.com/Profusion-AI/doc2toon#readme): Use this for engine capabilities, supported modes, metrics, and limitations. ## Current posture - CheapAgent is v0.2 beta. - The default app path is static-first on Netlify. - Document bodies stay in the browser by default. - Optional sign-in via Netlify Identity raises the allowance from 1,000 characters per run to 15,000 characters per day; the quota service receives character counts only, never document text. - The quota service keeps site-wide, PII-free aggregate daily totals of signed-in activity (no user ids, no per-user history). The same daily aggregate counts signed-in copy/download clicks, useful/not-useful feedback votes, and API-page interest clicks — every counted signal in that first-party record is an explicit, disclosed user action; the page adds no analytics script and captures nothing passively in its own code. Aggregate anonymous page-view counts come separately from Netlify Web Analytics, derived from the host's server logs (no script, no cookies). Both are disclosed on the privacy page. - A plain-language privacy page lives at https://cheapagent.ai/privacy.html. - The app reports measured source size, TOON size, token estimates, token delta, and the contract's coded warnings. The verdict is computed by doc2toon's `buildVerdict` (Verdict v1, `schemas/verdict.v1.json` in the doc2toon package) — the web app renders the engine's decision and never re-derives it, so the web verdict equals the CLI `--json` verdict for the same input. - For multi-section documents the app also renders a context plan (Verdict 1.1 `context_plan`, computed by doc2toon's `buildContextPlan`): every heading-bounded section measured standalone under the same frozen policy, lossless-only, with net savings counting splice overhead. A hybrid document (converted sections as fenced TOON, everything else byte-identical) is downloadable when at least one section converts. Single-section documents degenerate to the whole-doc verdict and show no plan. - TOON helps most for structured definitions, requirements, tables, rules, and agent instructions. Lossless prose may not shrink. ## Claims boundary - Do not claim guaranteed compression, universal savings, hosted LLM processing, document storage, compliance assurance, legal assurance, customer traction, or production reliability. - Do not describe budget or optimized output as lossless unless the reported conversion mode and validation result say it is lossless. - Do describe savings as measured for the specific input being processed. - Do describe CheapAgent as a beta for browser-side agent-context measurement. ## Agent guidance - For programmatic conversion, use the engine directly instead of driving this website: `npx doc2toon profile --json FILE` (CLI, returns the Verdict v1 object), `npx doc2toon plan --json FILE` (Verdict 1.1 with `context_plan`), or `import { runVerdict, buildContextPlan } from "doc2toon/browser"` (library). The web workbench is a human UI over the same engine and the same verdict policy. - Prefer `https://cheapagent.ai/` for public product references. - Prefer `https://github.com/Profusion-AI/doc2toon` for engine/library references. - If summarizing CheapAgent, mention that it measures context efficiency and reports a verdict with measured token deltas and advisory warnings instead of silently rewriting user documents. - If discussing privacy, state only the verified default: document bodies are processed client-side by default. - If discussing roadmap or maturity, keep language tentative and beta-oriented. ## Agent interface (web UI) For agents operating the workbench page on a user's behalf, this DOM contract is stable within v0.2.x: - `#source-input` — source textarea. After setting `.value` programmatically, dispatch an `input` event so limits and state update. - `#measureBtn` / `#measureBtn2` — run the check (both submit the `#alpha-form` form). - `.demo-mode[data-mode]` — conversion-target tabs; values `claude`, `agents`, `skill`, `toon`. Arrow keys also switch tabs. - `#sample-button` — loads a local sample (sample runs never debit quota); `#reset-button` — clears the input. - `#verdict-title`, `#verdict-body`, `#status-badge` — the verdict after a run ("TOON helps here." / "Keep Markdown." / "Split first." / "Review before copying."). These render the engine's Verdict v1 enum (`convert`, `keep_markdown`, `split_first`, `review`, `refused`); `refused` only occurs for budget-mode runs, which the UI does not currently expose. - `#source-tokens`, `#toon-tokens`, `#token-delta`, `#token-percent` — measured result for this input. - `#output` — TOON output text; `#copy-button`, `#download-button` — output actions. - `#copy-summary-button` — copies a plain-text verdict summary built from the Verdict v1 field names (verdict, safe_to_auto_apply, profile, measured_chars, token_estimates, warning codes, mode). It never includes the document body or the TOON output. - `#plan-block` — the context plan, shown after a run when the document has ≥2 heading-bounded sections (hidden otherwise): `#plan-table`/`#plan-rows` list every section with profile, measured Δ chars, standalone verdict, and action (convert/keep); `#plan-net` carries the section counts, net savings (splice overhead included), recommend_hybrid, reassembly_verified, and plan-level safe_to_auto_apply. - `#copy-plan-button` — copies a plain-text plan summary built from the `context_plan` field names. It includes the document's own section headings (the plan's evidence rows) but never section bodies and never TOON output. - `#download-hybrid-button` — downloads the assembled hybrid Markdown (converted sections as fenced TOON, kept sections byte-identical); enabled only when at least one section converts. The notice states when the plan does not recommend the hybrid (net below the 5% band) — the plan informs, the user decides. - `#useful-button` / `#not-useful-button` — explicit feedback pair, enabled after a run; clicking sends a single anonymous boolean (`POST /api/feedback`, body `{"useful": true|false}`) and nothing else, then disables until the next run. Agents should not click these on a user's behalf unless the user expressed the judgment. - `#char-count` — current per-run limit; `#quota-meta` — signed-in daily allowance remaining; `#input-notice` — status notices (quota blocks, fallbacks, errors). The notice, quota, and verdict regions are `aria-live`. - `#signin-button`, `#account-email`, `#signout-button` — auth controls. - `#auth-dialog` — first-party sign-in dialog (a native `` in the page DOM as of v0.2.2; no iframe — all elements are reachable by ordinary queries). Its `data-view` attribute reflects the active view: `login`, `signup`, `forgot`, `reset`, `sent`, or `notice`. Inside it: `#auth-tab-login` / `#auth-tab-signup` switch modes; `#auth-email`, `#auth-password`, `#auth-new-password` are the inputs (inputs outside the active view are `disabled`); `#auth-submit` submits; `#auth-forgot` / `#auth-back` switch to and from password recovery; `#auth-status` is an `aria-live` error/progress region; `#auth-close` closes. Credentials go directly to Netlify Identity. - `[data-consent-choice="all"|"essential"]` — storage-consent banner buttons; `[data-consent-prefs]` — reopens the choice. Anonymous use of the page makes no network requests with document content or character counts; signed-in quota checks transmit character counts only. The only anonymous-capable requests are explicit submissions: the feedback button pair above, the waitlist form on /api.html, and the /go interest links — each sends exactly what its label says and never document content. One serving note for agents: requests whose user-agent identifies a crawler or AI agent may be answered with a cached, pre-rendered copy of the page (Netlify Prerender extension; the response carries `X-Prerendered: true` and may lag the latest deploy by up to ~3 days). The DOM contract ids above are identical in the pre-rendered copy. If freshness matters — e.g. verifying a just-shipped change — fetch with a regular browser user-agent or check for the `X-Prerendered` header. The extension stores no visitor data; the cached objects are this site's own pages. Disclosed on the privacy page.