Hi All,
Long-time reader, finally made an account.
I wanted to introduce something my team and I have been building, mostly because the core of it is an Elixir and Rust bet and I would really like this community’s take on it.
Semurg holds every type of data (relational, graph, object, document, search, vector, time-series) as one fixed 64-byte binary container, in a single engine over one copy of the data, CPU-only, on hardware you control. The engine is a commercial, closed-source product, but the installer and a full benchmark suite are now open, and the first node is free forever. It is live with no login at one.semurg.io, and you can now stand up your own node in one command and benchmark it yourself:
Install a node (prebuilt engine, no compiler, no Rust, no separate Erlang): GitHub - One-Semurg/Semurg-Install: Official one-command installer for Semurg. Downloads and runs the released Semurg engine — your first node is always free. Install script and release binaries only; this repo does not contain the engine source. · GitHub
Benchmark it on your own box against the engines you already run, equal-answer gated and bit-exact: GitHub - One-Semurg/Semurg-Benchmark-Suite: Run-it-yourself benchmarks comparing Semurg to leading open-source databases across eleven data domains - on your own hardware, your own results (no published numbers). · GitHub
The part that belongs on this forum is how it is put together:
BEAM conducts, Rust does the heavy lifting. Elixir and OTP own supervision, scheduling and fault tolerance. The per-byte work runs in Rust NIFs, one concurrent arm per physical core, with no shared write lock between them. We hand each NIF a whole batch and fan out inside a single crossing rather than paying the boundary cost per item, and only tokens and offsets ever cross, never materialised data. Long jobs go on dirty schedulers, and every NIF has a pure-BEAM fallback, so a missing or failed native artifact costs us throughput rather than taking the VM down.
The 64 bytes are not arbitrary. One container is a CPU cache line, 64 of them is a 4KB disk to RAM page, so the storage format is aligned to what the hardware actually moves.
Agents are just supervised BEAM processes over the same store, so a swarm gets isolation and concurrency from the runtime rather than from containers.
On scope, so I am not overselling it: the substrate and the gateway are live today, and you can run a node yourself now. With local models your data never leaves your box, so tokenising PII before an external model call, which I used to do, is not something I need any more, and I have dropped it. Growing CPU-native models on the same substrate is still research, and I try to keep that line clear.
On numbers, rather than ask you to trust a chart: the benchmark suite stands up each open-source incumbent from its official image, on the same deterministic data, and only counts a result if its answer hash matches an independent reference. It prints the losses straight next to the wins. The OLAP lane shows Semurg’s raw-scan loss to DuckDB honestly, next to the O(1) fold win. The graph lane has an out-of-core regime where the in-RAM engines DNF on a fixed small memory budget and Semurg finishes the traversal at flat memory, which is the property I actually care about.
Happy to go into as much depth as anyone wants on the orchestration and the BEAM side. The storage layout and IO mechanics are the bit we keep closed, so I will be vaguer there, but everything above that is fair game.
What I would most like is to hear from anyone who has run BEAM and Rust NIFs in production, especially dirty schedulers and large batched crossings. What caught you out? I have a feeling we are not the first to learn some of these the hard way.
Thanks






















