The short version
Vexil started from a frustration I have with binary protocols: eventually the real specification stops being the specification.
It becomes several codecs, some conventions, a handful of tests, and whatever everyone currently believes the bytes are supposed to mean.
I wanted the contract itself to be explicit.
A Vexil schema describes both the shape of the data and how it exists on the wire. Bit widths, field ordinals, integer encodings, bounds, and evolution rules live together instead of being scattered through handwritten codecs.
From one contract, the toolchain generates codecs for Rust, TypeScript, Go, and Python. The goal is not merely smaller messages. I want the same value to produce the same bytes everywhere, and I want protocol drift to become visible before it ships.
This is one of the projects where my tendency to care far too much about exactness is probably being put to appropriate use.
Why I am building it
Binary formats often begin as a few reasonable encoding choices and gradually become an undocumented agreement between implementations. Encoding a number is easy. Preserving the agreement while languages, implementations, and versions diverge is the interesting part.
Vexil treats that agreement as a language of its own. Schemas carry a canonical hash, and the compatibility checker classifies changes before they become production surprises. The wire format becomes something a person can inspect and reason about rather than an incidental result of code.
What exists today
- A schema language with exact-width integers, enums, messages, collections, imports, and explicit wire encodings.
- A compiler and CLI for checking schemas, generating codecs, and evaluating compatibility.
- Generated runtimes for Rust, TypeScript, Go, and Python.
- A normative language specification and binary wire-format specification.
- Shared conformance vectors and cross-language examples.
- An emerging language-server surface.
The interesting constraint
The wire format is deliberately not self-describing. Both peers compile the schema they intend to use and can compare its hash.
That trades runtime flexibility for compactness and an exact, inspectable contract. It is a useful trade for telemetry, embedded systems, and other protocols where representation matters rather than merely being an implementation detail.
Where it actually stands
Vexil is pre-1.0.
Rust and TypeScript currently have the broadest generated-code evidence. Go and Python cover a representative shared wire matrix but do not yet have the same breadth. The language server on the main branch reports compiler diagnostics; richer editor capabilities are still future work.
I care about keeping that distinction visible. One thing I do not want this site to become is a place where every unfinished capability quietly changes tense until it sounds shipped.
Explore it
The project website contains the documentation and specifications. The GitHub repository contains the source, examples, and conformance material.
The quickstart follows one schema through generation, exact bytes, and a round trip. The cross-language example exercises the same fixture in all four generated targets.