We are pleased to announce today the initial release of Transit.

Transit is a format and set of libraries for conveying values between applications written in different programming languages. The key objectives of Transit are to support:

Sending values between applications

written in different programming languages

without requiring schemas/context i.e., to be self-describing at the bottom

with extensibility

and good performance

with reach to the browser

JSON currently dominates similar use cases, but it has a limited set of types, no extensibility, and is verbose. Actual applications of JSON are rife with ad hoc and context-dependent workarounds for these limitations, yielding coupled and fragile programs.

On the other hand, the reach of JSON is undeniable. High performance parsers are widely available. Thus Transit is specified as an encoding to and from both JSON and MessagePack, a binary JSON-like format with widely available parsers. In particular, both formats have parsers written in C for languages like Ruby and Python that reach to C for performance.

Transit supports a minimal but rich set of core types:

strings

booleans

integers (to 64 bits w/o truncation)

floats

nil/null

arrays

maps (with arbitrary scalar keys, not just strings)

Transit also includes a wider set of extension types:

timestamps

UUIDs

URIs

arbitrary precision integers and decimals

symbols, keywords, characters

bytes

sets

lists

hypermedia links

maps with composite keys

Transit is extensible - users can define extension types in exactly the same way as the included extension types.

The emphasis of Transit is on communication between programs, thus it prioritizes programmatic types and data structures over human readability and document orientation. That said, it does have a readable verbose mode for JSON.

Transit is self describing using tags, and encourages transmitting information using maps, which have named keys/fields which will repeat often in data. These overheads, typical of self-describing formats, are mitigated in Transit by an integrated cache code system, which replaces repetitive data with small codes. This yields not only a reduction in size, but also an increase in performance and memory utilization. Contrast this with gzipping, which, while it may reduce size on the wire, takes time and doesn't reduce the amount of text to be parsed or the number of objects generated in memory after parsing.

We are shipping an 0.8 version of the Transit spec, which has extensive documentation for implementors, as well as interoperable implementations for:

Java

Clojure

JavaScript (NodeJS and browser)

ClojureScript

Ruby

Python

We welcome feedback and suggestions on the transit-format list.

I'd like to thank the team at Cognitect that built Transit:

Tim Ewald - Team Lead

Brenton Ashworth

Timothy Baldridge

Bobby Calderwood

David Chelimsky

Paul deGrandis

Benoit Fleury

Michael Fogus

Yoko Harada

Ben Kamphaus

Alex Miller

David Nolen

Russ Olsen

I hope you find Transit useful, and look forward to your feedback.

Rich