HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
fastserial
lite3
C2025–2026
fastserial / lite3

lite3

A JSON-Compatible Zero-Copy Serialization Format

9Distinct people
15Mentions
0Explicit recommenders
810GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

A JSON-Compatible Zero-Copy Serialization Format

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 1:49:46 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by week15 dated mentions

Observed mentions: 2025-11-20 14:20:59 UTC to 2026-02-24 13:28:44 UTC. Weeks start Monday, UTC.

012342025-11-17 00:00:00 UTC to 2025-11-24 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 commentsNov 172025-11-24 00:00:00 UTC to 2025-12-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-12-01 00:00:00 UTC to 2025-12-08 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2025-12-08 00:00:00 UTC to 2025-12-15 00:00:00 UTC (exclusive): 3 mentions; 1 submissions, 2 comments2025-12-15 00:00:00 UTC to 2025-12-22 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2025-12-22 00:00:00 UTC to 2025-12-29 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2025-12-29 00:00:00 UTC to 2026-01-05 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2026-01-05 00:00:00 UTC to 2026-01-12 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 commentsJan 52026-01-12 00:00:00 UTC to 2026-01-19 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2026-01-19 00:00:00 UTC to 2026-01-26 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2026-01-26 00:00:00 UTC to 2026-02-02 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2026-02-02 00:00:00 UTC to 2026-02-09 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2026-02-09 00:00:00 UTC to 2026-02-16 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2026-02-16 00:00:00 UTC to 2026-02-23 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2026-02-23 00:00:00 UTC to 2026-03-02 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 commentsFeb 23

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
Nov 172025-11-17 00:00:00 UTC2025-11-24 00:00:00 UTC110
Nov 242025-11-24 00:00:00 UTC2025-12-01 00:00:00 UTC000
Dec 12025-12-01 00:00:00 UTC2025-12-08 00:00:00 UTC101
Dec 82025-12-08 00:00:00 UTC2025-12-15 00:00:00 UTC312
Dec 152025-12-15 00:00:00 UTC2025-12-22 00:00:00 UTC404
Dec 222025-12-22 00:00:00 UTC2025-12-29 00:00:00 UTC101
Dec 292025-12-29 00:00:00 UTC2026-01-05 00:00:00 UTC101
Jan 52026-01-05 00:00:00 UTC2026-01-12 00:00:00 UTC101
Jan 122026-01-12 00:00:00 UTC2026-01-19 00:00:00 UTC000
Jan 192026-01-19 00:00:00 UTC2026-01-26 00:00:00 UTC101
Jan 262026-01-26 00:00:00 UTC2026-02-02 00:00:00 UTC000
Feb 22026-02-02 00:00:00 UTC2026-02-09 00:00:00 UTC101
Feb 92026-02-09 00:00:00 UTC2026-02-16 00:00:00 UTC000
Feb 162026-02-16 00:00:00 UTC2026-02-23 00:00:00 UTC000
Feb 232026-02-23 00:00:00 UTC2026-03-02 00:00:00 UTC101

What Hacker News says

15 sources
Very cool project! Being able to replay history is huge and makes it possible to look back in time without having to make full copies of the database. This is something that is very much lacking in many SQL systems where you need 'temporal tables' to achieve the same effect, but those are really limited as they have to be setup specifically and often duplicate data unnecessarily. If you are interested in this topic, I suggest you study Datomic and the EAVT data model. This is likely where database architecture in the future will be headed. > The database is stored in memory. So it must be small enough to fit in RAM, and the full journal has to be replayed from scratch when opening a file. For larger datasets, you really want disk support. Using something like SQLite or DuckDB as an append-only store is another way to achieve this effect.
Read the rest
Also lack of a proper query language will be a problem for long term serious use. A simple hand-rolled program API can only get you so far, until you need more advanced querying. > Unlike XML or JSON, joedb is a binary file format that does not require any parsing. So, joedb files are much smaller, and processing data is much faster. Some time ago I created a JSON-compatible serialization format that is zero-copy (no parsing required): https://github.com/fastserial/lite3 It doesn't do transactions or history versioning, but it is also very fast in memory. Something like jq or JSONPath on a disk-file version of this format could be interesting.
In Joedb, the Journal-Only Embedded Database
Increasingly the performance limit for modern CPUs is the amount of data you can feed through a single core: basically memcpy() speed. On most x86 cores the limit is around 6 GB/s and about 20 GB/s for Apple M chips. When you see advertised numbers like '200 GB/s' that is total memory bandwidth, or all cores combined. For individual cores, the limit will still be around 6 GB/s. This means even if you write a perfect parser, you cannot go faster. This limit also applies to (de)serializing data like JSON and Protobuf, because those formats must typically be fully parsed before a single field can be read. If however you use a zero-copy format, the CPU can skip data that it doesn't care about, so you can 'exceed' the 6 GB/s limit. The Lite³ serialization format I am working on aims to exploit exactly this, and is able to outperform simdjson b
Read the rest
y 120x in some benchmarks as a result: https://github.com/fastserial/lite3
In I/O is no longer the bottleneck? (2022)
> It seems like maybe the documentation needs to be updated Looks like it, yes: /** Enable hash probing to tolerate 32-bit hash collisions. Hash probing configuration (quadratic open addressing for 32-bit hashes: h_i = h_0 + i^2) Limit attempts with `LITE3_HASH_PROBE_MAX` (defaults to 128). Probing cannot be disabled. */ #ifndef LITE3_HASH_PROBE_MAX #define LITE3_HASH_PROBE_MAX 128U #endif #if LITE3_HASH_PROBE_MAX < 2 #error "LITE3_HASH_PROBE_MAX must be >= 2" #endif > It also means that the spec will ossify around a specific hash function It is a bit ugly, and will break backwards compatibility, but supporting a second hash function isn’t too hard. You can, on load, hash a few keys, compare them to the hashes, and, from that, if the input has many keys with high probability, infer which hash fu
Read the rest
nction was used. There also might be spare bit somewhere to indicate ‘use the alternative hash function’. Reading the code (nice-looking, BTW, for C code, but since it is C code, also full of warnings that other languages can protect you from) I spotted this (https://github.com/fastserial/lite3/blob/acbb97984eca1183ddc...): > The JSON standard requires that the root-level type always be an ‘object' > or 'array'. This also applies to Lite³. I don’t think that is true, and https://www.json.org/json-en.html agrees with that. Single values (numbers, strings, booleans, null) also are valid json.
In Lite^3, a JSON-compatible zero-copy serialization format
Looking at the actual code (https://github.com/fastserial/lite3/blob/main/src/lite3.c#L2...), it seems like it performs up to 128 probes to find a target before failing, rather than bailing immediately if a collision is detected. It seems like maybe the documentation needs to be updated? It's a bit unfortunate that the wire format is tied to a specific hash function. It also means that the spec will ossify around a specific hash function, which may not end up being the optimal choice. Neither JSON nor Protobuf have this limitation. One way around this would be to ditch the hashing and use the keys for the b-tree directly. It might be worth benchmarking - I don't think it's necessarily any slower, and an inline cache of key prefixes (basically a cheapo hash using the first N chars) should help preserve performance for common cases.
In Lite^3, a JSON-compatible zero-copy serialization format
(I made rkyv) I took a look at lite3/tron because I was interested in seeing how it approached some of the issues I ran into with rkyv. I ended up with some additional information related to points 1 and 2 I figured I'd write down: 1) You're correct, rkyv uses a B-tree with a default branching factor of 6 [1]. I don't think I've ever implemented a binary tree in any version of rkyv - maybe one of the earliest versions used a sorted vec instead of a B-tree? I hate the B-tree map implementation because it is so complicated, even though it actually used to be even worse in 0.7 when it was implemented as a B+ tree. Sorry for making you read any of it! 2) Arbitrary mutations would definitely be an improvement on rkyv, and I was most interested to see what kind of approach lite3/tron took! Unfortunately growing the buffer is not supported [2] a
Read the rest
nd freed memory isn't reclaimed [3]. These are the two actually difficult problems standing in the way of rkyv getting more comprehensive mutation support, so unfortunately I think there's nothing valuable to take away here. The issue with growing the buffer is that you invalidate any pointers into the buffer and have to manually fix them up (e.g. by re-crawling the buffer). There's not a decent approach I'm aware of which manages these pointer fixups in a way that limits complexity and avoids really nasty API surfaces. The issue with memory reclamation is that you effectively have to add an allocator to your buffer, and that allocator has to also be persistable. I actually got this part working in rel while that was still a project worth hacking on [4]. I just ran out of steam and willingness to play the type-tac-toe required to get a safe API out of it. The main problem I ran into there was related to value branding, since you shouldn't be allowed to make references to objects which cross between contiguous buffers. This project is neat, but it does basically just look like an rkyv-converted `BTreeMap<String, JsonValue>`. [1]: https://github.com/rkyv/rkyv/blob/main/rkyv/src/collections/... [2]: https://github.com/fastserial/lite3/blob/main/src/lite3.c#L5... [3]: https://lite3.io/design_and_limitations.html#autotoc_md29 (see note at end of section) [4]: https://github.com/rkyv/rel/blob/main/rel_example/src/main.r...
In SQLite JSON at full index speed using generated columns
It is also possible to encode JSON documents directly as a serialized B-tree. Then you can construct iterators on it directly, and query internal fields at indexed speeds. It is still a serialized document (possible to send over a network), though now you don't need to do any parsing, since the document itself is already indexed. It is called the Lite³ format. Disclaimer: I am working on this. https://github.com/fastserial/lite3
In SQLite JSON at full index speed using generated columns

Show HN: Lite³ – A JSON-Compatible Zero-Copy Serialization Format in 9.3 kB of C

My name is Elias de Jong, I am a software engineer and long-time HN lurker from the Netherlands. Some time ago, I started a project that would require a high performance networking system. Naturally, to send data between computers I also needed a serialization format, but a text format like JSON was just too slow. I started researching binary formats. But to my surprise, every binary format had major downsides. Almost all of them require schema definitions up front written in an IDL, as well as extra tooling and build steps. Schema evolution is also fragile and hard to maintain backwards compatibility. It feels like being forced into a choice: 1) JSON: convenient but slow 2) Binary formats: fast but painful to use Why do I need to choose? I don't want to sacrifice my sanity to get acceptable performance. I kept looking and found a researc
Read the rest
h paper from 2024 about a conceptual schemaless zero-copy format. Lightning struck. This idea seemed extraordinary: you essentially send a serialized B-tree over the network so that the receiver can perform lookups and mutations directly without parsing. The only problem: nobody had made a (public) implementation yet. I figured sometimes you have to be the first, so for the last 6 months I've been working on this and am proud to say it is now released and open source under MIT license. The ability to modify serialized data directly is something not typically supported by other formats. I also extended the original format with JSON compatibility, such that it is now possible to convert between Lite³ and JSON. Despite this, it achieves performance on-par with modern zero-copy formats like Flatbuffers and Cap'n Proto. Right now the implementation is in C, but I plan to create bindings for other languages as well. So hopefully some fellow developers find it interesting! Official GitHub repository: https://github.com/fastserial/lite3 Official documentation site: https://lite3.io Mailing list: see project README
4 points · Open discussion

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.