EPUB · Office · OpenDocument · SVG · WACZ

Five small, offline tools for the files you ship.

Each one reads a file format directly and reports what breaks accessibility, or proves an archive has not changed. They run on your machine, in a container, or in CI. No network, no JVM, no GUI.

~/work/book
$ booklens audit book.epub --quietbook.epub: 10 error(s), 8 warning(s), 1 info$ officelens report.docx --quietreport.docx: 2 error(s), 2 warning(s), 0 info$ odflens budget.ods --quietbudget.ods: 0 error(s), 1 warning(s), 0 info$ iconlens icons/*.svg --quietlogo.svg: 3 error(s), 2 warning(s), 0 info$ waxseal verify archive.wacz -s archive.seal.jsonOK  root 7ce7902d…  signature valid

The tools

Four accessibility auditors and one archive-integrity tool. Same shape: a CLI, a library, JSON and SARIF output, and a browser playground on every site.

booklens EPUB Audits an EPUB against EPUB Accessibility 1.1 and WCAG 2.x, then writes a repaired book. Fixes metadata, language, headings, image alt text, and the navigation document. bunx github:srivtx/booklens#main
officelens DOCX · PPTX Reads the OOXML part XML directly and flags missing alt text, heading order, language, table headers, and link text across the main part, headers, footers, and notes. bunx github:srivtx/officelens#main
odflens ODT · ODS · ODP Audits OpenDocument text, spreadsheets, and presentations with rules gated by format, so a sheet or a deck is not judged by text-document rules. No LibreOffice, no Java. bunx github:srivtx/odflens#main
iconlens SVG Computes the accessible name of a standalone SVG the way a screen reader would, then flags the structural failures that break it, before the asset reaches a page. bunx github:srivtx/iconlens#main
waxseal WACZ Builds a deterministic Merkle root over every member of a web archive and signs it with Ed25519. Verification is offline, and any single member can be proven without shipping the archive. bunx github:srivtx/waxseal#main

Why these exist

Accessibility checking is solved for PDF and HTML, and largely unsolved for the formats people actually author documents in.

These tools fill the gaps the incumbents leave: the asset on disk, the Office file, the OpenDocument file, the EPUB that needs repairing rather than just reporting. They share one small, boring contract, so wiring any of them into a pipeline is the same job every time.

Offline by default
Files are read on your machine. No uploads, no telemetry, no network calls. The same run works on a laptop or in an air-gapped runner.
Deterministic output
Stable ordering, stable JSON, and reproducible fixes and seals, so a diff in CI means a real change.
Built for CI
Text, JSON, and SARIF 2.1.0 output, a documented exit-code scheme, and a threshold flag so a pull request fails on the severity you choose.

For agents

The output is made to be read by a program, not scraped from a screen.

Every tool emits stable JSON with --json, writes SARIF 2.1.0 for code scanning, and uses a documented exit-code scheme. iconlens reads standard input, so a file never has to touch disk. Point an agent at the JSON and it gets the same findings a human sees, with a rule code and a WCAG reference on each one.

iconlens --json
$ iconlens logo.svg --json{  "file": "logo.svg",  "counts": { "error": 3, "warning": 2, "info": 0 },  "issues": [    { "code": "SVG-NAME-001", "severity": "error", "wcag": "4.1.2" }  ]}

An MCP server

lenses-mcp exposes all five tools to any Model Context Protocol client, so an agent can audit a file and read the result without shelling out by hand. It speaks stdio and returns the same JSON. Eight tools: audit for each format, booklens_fix, and waxseal_seal, waxseal_verify, and waxseal_inspect.

mcp config
{  "mcpServers": {    "lenses": {      "command": "bunx",      "args": ["github:srivtx/lenses-mcp#main"]    }  }}

Each site also serves an llms.txt, so an agent can read the docs index without parsing HTML.

Install

Each tool installs with one script, or runs without installing.

install
# install a binary$ curl -fsSL https://raw.githubusercontent.com/srivtx/<tool>/main/install.sh | sh# or run one without installing$ bunx github:srivtx/<tool>#main --help# tools: booklens officelens odflens iconlens waxseal

Requires Bun. The install script checks for Bun, installs the binary globally, and verifies it is on your PATH.