News for hackers. Stuff that matters.

eliasdejong

Re:LeanDB a strongly Typed SQL front end on Monday August 31, 2026 @03:06PM (#49513640)
> typed databases let you express queries which are just super hard to express otherwise

Isn't type validation already in SQL with `CHECK` constraints? I don't see what the language is adding here exactly.

Re:Building Progressively Enhanced Forms Using Htmx on Thursday August 06, 2026 @07:33PM (#49204091)
> FWIW I have a potential solution: to show live data in my app I use an SSE stream of OOB swaps.

You might be interested in Datastar [1], which is like htmx but centered around Server-Sent Events. You don't have to do diffing yourself in application code because it's already handled by the framework under the hood through the "idiomorph" DOM morphing algorithm.

[1] https://data-star.dev/

Show HN: Plox – Lox compiler in ~600 LOC from the 'Crafting Interpreters' book

https://github.com/eliasdejong/plox

'Crafting Interpreters' is Bob Nystrom's book that teaches you how to build a compiler from scratch. It is an excellent resource and I can highly recommend it. Really light to read and walks you through all the concepts step-by-step.The first part of the book builds a compiler for the 'Lox' toy language in Java. While I have nothing against Java, personally I have never used it much so I...

( Read More... | no comments | 2 points | on HN )
Re:A Trillion Characters on Friday May 29, 2026 @05:26PM (#48329508)
standby, server is taking some load. should be back up soon
Re:A Trillion Characters on Friday May 29, 2026 @05:01PM (#48329214)
Creator here,

For those interested:

- ZERO CLIENT-SIDE OR INLINE JAVASCRIPT except Datastar & Datastar attributes

- real-time multiplayer powered by CQRS

- 45x45 characters chunks stored in LMDB

- all characters are read & written through FULL ACID TRANSACTIONS. no shortcuts. no relaxations

- chunk-based viewport culling

- LZ4 compression on chunk-basis to remove white space and repeating chars

- runs on a 5,52 euro/mo VPS in Germany, cheapest tier in public cloud

Stack: Datastar, Python/FastAPI, LMDB

Re:A Trillion Characters on Friday May 29, 2026 @04:52PM (#48329098)
check info tab on the top
Re:Collaborative Editing in CodeMirror on Wednesday May 06, 2026 @06:18AM (#48034525)
Read your blogpost, I will need a code editor soon so I might have a stab at hacking something together.

> but this doesn’t really work in mobile and it messes with the selection

I haven't tested it personally, but on the OverType they claim "excellect mobile support".

Re:Collaborative Editing in CodeMirror on Tuesday May 05, 2026 @05:06PM (#48028559)
CodeMirror is great, but still requires a lot of clientside JavaScript. I wonder if it would be possible to create a code editor in the same style OverType[0], where the editor is basically just an HTML textarea. You would need 70% less JavaScript code to do exactly the same thing, and it supports syntax highlighting out of the box[1].

[0]: https://github.com/panphora/overtype

[1]: https://github.com/panphora/overtype/pull/35

Re:Ask HN: What Are You Working On? (February 2026) on Monday February 09, 2026 @07:22PM (#46953628)
Checkout DataStar, it's also a hypermedia web framework but it subsumes the functionality of htmx, is faster, more efficient and fits inside 11 KiB. It uses SSE + brotli streaming compression to achieve compression ratios up to 4000x. It makes the web client completely stateless. Building a webapp cannoy be simpler really.
Re:We mourn our craft on Sunday February 08, 2026 @01:56PM (#46937310)
To me this sentiment is silly. Programming was never about the act of writing, but about making the computer do something. Now we can ask computers to helps us write instructions for them. Great if you ask me. And no, your job is not going away because human maintainers will always be required to review changes, communicate with stakeholders and provide a vision for the projects. I have yet to see a chatbot that can REDUCE entropy inside a codebases rather than continuously increase it with more and more slop.
Re:Joedb, the Journal-Only Embedded Database on Tuesday February 03, 2026 @05:31PM (#46878295)
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.

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.

Re:Replacing Protobuf with Rust to go 5 times faster on Friday January 23, 2026 @12:23PM (#46735090)
Performance of Protobuf is a joke. Why not use a zero copy format so that serialization is free? For example, my format Lite³ which outperforms Google Flatbuffers by 242x: https://github.com/fastserial/lite3
Re:Why There's No Single Best Way to Store Information on Saturday January 17, 2026 @03:26PM (#46661696)
See also, RUM Conjecture: https://www.codementor.io/@arpitbhayani/the-rum-conjecture-1...

Conceptually similar to CAP, but with storage trade-offs. The idea is you can only pick 2 out of 3.

Really excellent research and well written, congrats. Shows that io_uring really brings extra performance when properly used, and not simply as a drop-in replacement.

> With IOPOLL, completion events are polled directly from the NVMe device queue, either by the application or by the kernel SQPOLL thread (cf. Section 2), replacing interrupt-based signaling. This removes interrupt setup and handling overhead but disables non-polled I/O, such as sockets, within the same ring.

> Treating io_uring as a drop-in replacement in a traditional I/O-worker design is inadequate. Instead, io_uring requires a ring-per-thread design that overlaps computation and I/O within the same thread.

1) So does this mean that if you want to take advantage of IOPOLL, you should use two rings per thread: one for network and one for storage?

2) SQPoll is shown in the graph as outperforming IOPoll. I assume both polling options are mutually exclusive?

3) I'd be interested in what the considerations are (if any) for using IOPoll over SQPoll.

4) Additional question: I assume for a modern DBMS you would want to run this as thread-per core?

Re:I/O is no longer the bottleneck? (2022) on Tuesday January 06, 2026 @11:02AM (#46514053)
The library contains iterator functions that can be used to recursively traverse a message from the root and discover the entire structure. Then every value can be checked for defined constraints appropriately while at the same time validating the traversal paths. Also a schema description format is needed, perhaps something like JSONSchema can be used.

Doing this by definition requires processing an entire message which can be a little slow, so it is best done in C and exposed through CPython bindings / CFFI.

Re:I/O is no longer the bottleneck? (2022) on Tuesday January 06, 2026 @07:21AM (#46511379)
Imagine if you measured the speed of beer delivery by the rate at which beer cans can be packed/unpacked from truck pallets. But then somebody shows up with a tanker truck and starts pumping beer directly in and out. You might argue this is 'unfair' because the tanker is not doing any packing or unpacking. But then you realize it was never about packing speed in the first place. It was about delivering beer.
Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @11:49PM (#46508857)
The primary motivations were performance requirements and frustration with schema formats.

The ability to mutate serialized data allows for 2 things:

1) Services exchanging messages and making small changes each time e.g. adding a timestamp without full reserialization overhead.

2) A message producer can keep a message 'template' ready and only change the necessary fields each time before sending. As a result, serializing becomes practically free from a performance perspective.

Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @11:30PM (#46508748)
No, I have not benchmarked yet against other languages. Rkyv is Rust only.

One primary difference is that Rkyv does not support in-place mutation. So any modification of a message requires full reserialization, unlike Lite³.

Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @11:15PM (#46508665)
> A key feature of this code is that it skips CPU cache when copying

Are those numbers also measured while skipping the CPU cache?

Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @10:51PM (#46508538)
Yes, any zero-copy format in general will have this advantage because reading a value is essentially just a pointer dereference. Most of the message data can be completely ignored, so the CPU never needs to see it. Only the actual data accessed counts towards the limit.

Btw: in my project README I have benchmarks against Cap'N Proto & Google Flatbuffers.

Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @10:36PM (#46508465)
If the new value is equal size or smaller, it will overwrite the old value in-place. If it is larger, then the new value is appended to the buffer and the index structure is updated to point to the new location.

In the case of append, the old value still lives inside the buffer but is zeroed out. This means that if you keep replacing variable-sized elements, over time the buffer will fragment. You can vacuum a message by recursively writing it from the root to a new buffer. This will clear out the unused space. This operation can be delayed for as long as you like.

If you are only setting fixed-size values like integers or floats, then the buffer never grows as they are always updated in-place.

Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @10:03PM (#46508268)
The limit is the number of outstanding cache line requests to the memory controller. CPUs have a fixed number of slots for this, around 10-12 usually. Intel calls them LFBs (Line Fill Buffers) and AMD MSHRs (Miss Status Holding Registers). When the slots are filled, the CPU can issue no more requests and has to wait for them to complete. Apple M chips (probably) have more slots and the memory is physically packaged together with the CPU, so they get better numbers.
Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @09:50PM (#46508175)
Being schemaless is deliberate design decision as it eliminates the need for managing and building schema files. By not requiring schema, messages are always readable to arbitrary consumers.

If you want schema, it must be done by the application through runtime type checking. All messages contain type information. Though I do see the value of adding pydantic-like schema checking in the future.

EDIT: Regarding message size, Lite³ does demand a message size penalty for being schemaless and fully indexed at the same time. Though if you are using it in an RPC / streaming setting, this can be negated through brotli/zstd/dict compression.

Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @09:39PM (#46508105)
> 14 GB/s

Yes, those numbers are real but only in very short bursts of strictly sequential reads, sustained speeds will be closer to 8-10 GB/s. And real workloads will be lower than that, because they contain random access.

Most NVMe drivers on Linux actually DMA the pages directly into host memory over the PCIe link, so it is not actually the CPU that is moving the data. Whenever the CPU is involved in any data movement, the 6 GB/s per core limit still applies.

Re:I/O is no longer the bottleneck? (2022) on Monday January 05, 2026 @09:17PM (#46507948)
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 by 120x in some benchmarks as a result: https://github.com/fastserial/lite3

Re:Lite^3, a JSON-Compatible Zero-Copy Serialization Format on Friday December 19, 2025 @06:53PM (#46332363)
Yes, language ports are being worked on :)

You will be able to access the same data in different languages using APIs specific to your language.

Right now someone has already made a (private) Go port. And Rust is also in the works.

Re:Lite^3, a JSON-Compatible Zero-Copy Serialization Format on Friday December 19, 2025 @08:12AM (#46325434)
Hi, you are right in calling out the Postgres example in the context of DBs/MVCC. The purpose of JSONB is to be an indexable representation of JSON inside a Postgres database. It is not trying to be a standalone format for external interchange and therefore it is fulfilling very different requirements.

A serialization format does not care about versioning or rollbacks. It is simply trying to organize data such that it can be sent over a network. If updates can be made in-place without requiring re-serialization, then that is always a benefit.

Write amplification is still a fact however that I think deserves to be mentioned. To tackle this problem in the context of DBs/MVCC, you would have to use techniques other than in-place mutation like you mention: overlay/COW. Basically, LMDB-style.

And yes I think databases is where this technology will eventually have the greatest potential, so that is where I am also looking.

Re:Lite^3, a JSON-Compatible Zero-Copy Serialization Format on Friday December 19, 2025 @04:33AM (#46323908)
(author here)

The documentation page is out of date, the format now resolves collisions through quadratic probing.

Older »