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.

Seal "SVB accesible" — verifiable without rendering
Accessible name and description live inside the file, in a fixed-grammar chunk. The validator (svb validate) checks it with 14 verifications and issues a citable SHA-256 report — executing nothing.

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:

  1. 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.
  2. Accessibility is optional in practice: almost nobody ships <title>, <desc> or ARIA inside SVG, and nothing in the format can verify them.
  3. 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:

metricresult
median svb / optimized svg×0.277
raw SVB smaller than svgo+brotli100% of files
svb+brotli / svgo+brotli×0.545
median size467 B → 140 B
mean savings per file72.7% (570 B)
aggregate bytes saved73.8%
clean encodes1,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.