NimbleExperimental
Meta’s columnar file format, formerly called “Alpha”, built as a replacement for Parquet and ORC on very wide tables, such as machine-learning feature and training tables with thousands of columns.
- What it is
- File formats (columnar files)
- Type
- Open source
- Made by
- Meta
- License
- Apache 2.0
- Status
- Experimental. Its README calls Nimble a work in progress with no stability or versioning guarantees yet.
- Facts checked
- 23 October 2026
What it is
Nimble stores each column as one or more streams and is designed for tables that are wide rather than long: thousands to tens of thousands of columns, as found in feature engineering and model training at Meta. Its metadata is organized to stay light at that width and is stored in FlatBuffers instead of the Thrift or Protocol Buffers that Parquet and ORC use, so large metadata sections can be accessed efficiently. It encodes data in blocks rather than as one continuous stream, which keeps memory use while reading predictable.
Encoding is the part Nimble makes pluggable. A block can be stored as trivial values, a constant, a mostly-constant value plus exceptions, run-length, dictionary, bit-packed, varint, delta, prefix-compressed strings, or sparse booleans, among others, and encodings cascade: a dictionary’s list of unique values and its index array are each encoded again with whatever fits them best, and Zstd compression is applied at each level only when it helps. Which encoding to use is decided by a selection policy: the default estimates encoded size and weights it by how fast each encoding decodes, an alternative uses a machine-learning model, and a third replays a recorded layout. The library is C++, built with CMake, and is closely tied to Velox, Meta’s execution engine library, which it includes as a Git submodule. Meta asks other projects to use this one library and write bindings rather than reimplement the spec, to avoid the incompatible readers that older formats suffered from.
Why teams pick it
- Built for very wide tables, with metadata designed for thousands to tens of thousands of columns and streams
- Cascading encodings with pluggable selection policies, so new encodings can be added without changing the file layout
- Block encoding gives predictable memory use when decoding, which matters for large training reads
- Apache 2.0 code from Meta, developed alongside Velox
Watch out for
- Experimental: the README promises no stability or versioning guarantees yet, so the format and API can still change under you
- One C++ library and no other implementations by design, and that library is built on Velox, so reading Nimble from other engines and languages means writing bindings first
- Tightly coupled to Velox and built with clang and a long list of system dependencies; decoupling is still a stated plan
- SIMD- and GPU-friendly decoding plans are listed as goals, not implemented features
Alternatives
What all columnar files have in common →Compare side by side →
Apache ORCOpen sourceA columnar file format born in Hive: typed columns in large stripes, built-in indexes every 10,000 rows, and the storage behind Hive’s ACID tables.
PuffinOpen sourceApache Iceberg’s file format for the data that doesn’t fit in a manifest: a container of typed binary blobs, such as distinct-value sketches and deletion vectors, described by a JSON footer.
VortexOpen sourceA columnar file format and toolkit that keeps data compressed with modern encodings, reads single rows fast and runs filters directly on the compressed data, pitched as a faster successor to Parquet.How it fits with other technologies
What Nimble uses
See it in a real stack
No architecture uses Nimble yet. Drop it into the playground and wire it up yourself.Open playground →Where it came from2023–2026
Machine-learning feature engineering and training tables can have thousands of columns, and Meta wanted a format suited to that width, to replace file formats such as Apache Parquet and ORC. It built one, first called “Alpha”, with lighter metadata in FlatBuffers and an encoding system that could keep up with encoding research, which, as the README puts it, evolves faster than the file layout itself.
Yoav Helfman of Meta presented Nimble at VeloxCon 2024, and the code was published on GitHub; it was posted to Hacker News in April 2024. It lives in the facebookincubator organization under Apache 2.0 and is still developed together with Velox, which it includes as a Git submodule. The README still describes it as a work in progress without stability guarantees, while the encoding catalogue keeps growing.
Why it’s built this way
- FlatBuffers metadata instead of Thrift or Protocol Buffers
- With thousands of columns, decoding the whole footer to find a few columns is expensive; FlatBuffers can be read in place, entry by entry.
- Encodings separate from the physical layout
- The README notes that the state of the art in encoding moves faster than file layouts, so encodings are extensible and can be nested without changing the format.
- Block encoding instead of stream encoding
- Encoding fixed blocks rather than one long stream bounds the memory a reader needs, which keeps decoding predictable.
- One library, not a spec to reimplement
- Meta wants to avoid the fragmentation seen when every engine writes its own reader for a format, so it asks users to bind to the single Nimble library.
Timeline
- 2023
The Nimble repository is created (December)
- 2024
Yoav Helfman presents Nimble at VeloxCon; the code is public by April
- 2026
Still marked a work in progress, with no stability guarantees