SVB — Scalable Vector Binary
An open vector-image format I specified and implemented: the same geometry as SVG at around 27% of the size, with accessibility inside the file as a verifiable requirement — and it works today in any browser through a Service Worker.
svb validate) checks it with 14 verifications and issues a citable SHA-256 report — executing nothing.Live demo →
.svbicons rendering in your browser right now, via a Service Worker.Benchmark (1,087 SVGs) →
Real corpus (Feather, Bootstrap, Simple Icons) optimized with svgo before measuring. Full, reproducible data.
github.com/kinti/svb →
Byte-level spec, dependency-free codec, CLI with batch conversion, 56 tests and a reproducible benchmark. MIT.
Why it exists
SVG is stuck — and that leaves real room for improvement. The standard is frozen: SVG 2 died as an abandoned Candidate Recommendation and the W3C Working Group has been dormant for years. Meanwhile the format carries three structural problems:
- It is text, and text is expensive: every coordinate costs 3–8 bytes of ASCII, and transport compression (gzip/brotli) does not understand what it compresses.
- Accessibility is optional in practice: almost nobody ships
<title>,<desc>or ARIA inside SVG, and nothing in the format can verify them. - It does not evolve: no standard progressive rendering, SMIL half-dead, and every vector animation lives in proprietary formats (Lottie, Rive).
SVB attacks each problem head-on: binary encoding with delta coordinates and a shared style table; an accessibility chunk with a fixed grammar that a validator can require and an auditor can certify; and a chunk container built to evolve without breaking anything. By design it also cannot carry scripts: it removes the classic XSS vector of user-uploaded SVGs.
The numbers
Benchmark over 1,087 production SVGs, each one optimized with svgo first — comparing against an unoptimized SVG would be cheating:
| metric | result |
|---|---|
| median svb / optimized svg | ×0.277 |
| raw SVB smaller than svgo+brotli | 100% of files |
| svb+brotli / svgo+brotli | ×0.545 |
| median size | 467 B → 140 B |
| mean savings per file | 72.7% (570 B) |
| aggregate bytes saved | 73.8% |
| clean encodes | 1,087 / 1,087 |
The headline is the second row: the raw binary already beats brotli-compressed SVG. The reduction comes from the format itself, not from a downstream filter — in fact SVB is so dense that compressing it again makes it bigger.
The part I care about: accessibility
In SVB the accessible name and description are not optional attributes: they travel in their own chunk, with a fixed grammar and a presence flag in the file header. A validator can require it and an audit can certify it without interpreting the geometry. It is the same line of work as a11y-toolkit: making accessibility verifiable instead of merely recommended.
Status
Version 0.2.1: public specification with a formal container grammar, dependency-free JavaScript reference implementation, 56 tests, a working demo, a reproducible benchmark and a conformance and accessibility validator (svb validate: 14 checks and the "SVB accesible" seal). v0.2 added linear and radial gradients, repetition as templates and instances (<use> semantics at the binary layer) and MVT-style command packing. The tooling now reads like a serious project: batch conversion that reports everything it drops, public conformance vectors, and fuzzing with 6,000 mutants and zero failures. Still out: text, clip/mask and geometric modeling for the organic class — full roadmap in the repo. The standardization route (IANA media type, and a Community Group if there is traction) will be decided by adoption, not in advance.
Curious about the process, or want to use it in a project? Get in touch.