fats 0.1.2 · 2026-10-17

Changelog

View as MarkdownSource on GitHub

All notable changes to fats are in this file. Format: Keep a Changelog; versions: Semantic Versioning. Numbers come from my own runs on one Apple Silicon Mac, one run each unless a range is given; provider results move run to run. Method: docs/benchmarks.md.

0.1.2 - 2026-10-17

Added

  • npm package fatsearch (npm i -g fatsearch, npx fatsearch), generated by cargo-dist: it installs fats by downloading the release archive for the machine from GitHub at install (or at first run when install scripts are off). Every tagged release publishes it.
  • MCP Registry entry io.github.fatsearch/fats (server.json: the crates.io and npm packages, run as fats mcp), listed after every release by a GitHub OIDC workflow. check.sh fails when its version is not the crate’s.

Changed

  • The installers require glibc 2.35+ on Linux, the version the Linux builds link against (was 2.31, which let them install a binary that cannot start on 2.31–2.34).

Fixed

  • The key dir is made owner-only (0700) whenever fats saves a key into it, also when it existed already: on Linux the installer’s receipt can create ~/.config/fatsearch at 0755 before fats first runs.

0.1.1 - 2026-10-17

Added

  • Prebuilt binaries and installers via cargo-dist: every tagged release builds fats for macOS (Apple silicon, Intel), Linux (x86_64, ARM64) and Windows (x86_64) and attaches the archives, .sha256 checksums, GitHub build attestations and shell / PowerShell installers. A Homebrew formula (fatsearch/tap/fatsearch, installs fats) is generated too.

Changed

  • The crate’s homepage is the GitHub repository (was fatsearch.com, which has no site yet).

0.1.0 - 2026-10-17

First public release.

Added

  • fats <url>: fetch, clean, outline. One = line (title, place, counts, tokens, how it was fetched, what it cost), then numbered sections (u1#3) the agent reads on demand. Every page is cached; later reads are free.
  • Fetch ladder: plain request first, then Oxylabs (no JS, then JS) and Bright Data. Any one provider key works; with both, the cheaper route goes first. wait:N, timeout:N, fresh:true, country:xx, device:mobile, json.
  • Readers: HTML and PDF (one section per page). Pictures and videos are counted on the = line; pixels on request. Office files are stored, not read yet.
  • Honesty: a ! line names what is missing and the next free move; a render that failed is not offered again; the price glyph ≤$X is the worst case; nothing is dropped silently.
  • fats mcp: stdio MCP server, one tool fats(cmd), ~60-token card. fats setup finds, checks and saves keys (mode 600). fats stats, fats config, fats guide, --dry.
  • One static binary, ~17 MB, ~4 ms start. No daemon, no browser, no telemetry.
  • Command aliases, all free: login, keys, auth run fats setup; ?, commands print the guide; balance, usage, spend, credits run fats account. Words of other tools (whoami, logout, install, upgrade, …) get a ! line naming the right command, rc 2.
  • Discussion threads: fats uN comments lists the top-level comments, most replies first, one row each (uN#k · replies N · <text>). fats uN#k opens one comment with its direct replies; uN#k full reads its whole tree. The outline footer says how many comments this copy served; N of M comments served appears only when the page itself states its total, never as a guess. --help stays the same card, under 500 bytes.
  • fats gh <login> lists that account’s repositories by stars, not only repos that mention the name.
  • fats stats adds one spend line over all sessions (last 24 h and all time, unverified cuts apart). The ledger sits beside the keys, holds a time and a price per paid record, never a URL or a query, and is never swept.

Changed

  • Default wait: is 30 s (was 5 s): most walled renders finish inside it. A run still going reads pending with its free next move (→ fats uN wait:30).
  • timeout:N is one wall for every call of a command, the plain request included.
  • A batch of URLs runs at most 4 at once; ids are given in input order, dry:true prints the same ids, and a URL given twice is fetched once (its second row says same as above).
  • The cache lives in the OS cache dir (~/Library/Caches/fatsearch on macOS, ~/.cache/fatsearch on Linux, the local app-data dir on Windows; FATS_CACHE overrides it, but not with an empty, relative, / or home path). A page is kept 30 min after its last read and at most 60 min after its fetch; a swept id says so and names the refetch. Only a dir fats made itself is ever swept.
  • limit:N sets both the results a search fetches and the rows shown, at most 20 rows within the read cap; a larger N says it was capped.

Fixed

  • An unknown flag (--login, -x, rust --fast) is refused with a ! line and never becomes a paid web search. Beside an id or a file a dash word is a free filter (fats u1 -n). A dash inside a phrase is kept as typed.
  • A run whose process died reads ! abandoned in fats jN, in its page read and in stats, with what it spent and a priced next move.
  • A page that moves to a sign-in page is judged by whole words of its new address (login, sign_in, oauth, sso, …), so /authors or /docs/authentication is not a wall; a real sign-in wall is rendered once, not twice.