Beta Past initial proving, but the Python API surface may still shift before 1.0. WiredTiger on-disk format is stable, but there's no migration tool yet — don't put production data here.

The Rust PostgreSQL server ships as a binary now

20 September 2026 · Joe Drumgoole · Releases

Summary: secantusd-pg has prebuilt archives for the first time, and the site now leads with the two Rust servers.

Until this week the only way to run SecantusDB's PostgreSQL server was to clone the repository, check out a WiredTiger submodule and wait for cargo build --release. There are prebuilt archives now — secantusd-pg for Linux x86_64 and macOS arm64, each with a .sha256 alongside it. Download, extract, point it at a directory and a port, and psql connects. There is no Windows build yet; that one still builds from source.

It is the same storage engine underneath as the MongoDB server — the same vendored WiredTiger, the same on-disk format in the same directory. The two binaries are a hand-off rather than a pair: WiredTiger takes an exclusive file lock, so the second server to open a store exits rather than sharing it. A table written by secantusd-pg reads back through secantusd-rs as a collection with the PRIMARY KEY as its _id, which is worth knowing before you assume the arrow points both ways — it does not yet. The Rust SQL layer resolves names through a catalog only CREATE TABLE writes, so a collection written by pymongo is still relation "..." does not exist on the SQL side.

What the server answers is set by what a real client asks for rather than by a feature list. All 5,729 of psycopg 3's own tests run against it unmodified; 5,545 pass, 183 skip as out of scope, and exactly one fails — a static-typing check on psycopg's own class hierarchy that never reaches the wire. Whole type suites a real application leans on pass end to end: uuid, inet and cidr, enums, composites, ranges and multiranges, multidimensional arrays, numeric exact well past 34 digits, timestamptz honouring the session zone — each in text and binary format. So does the machinery around them: the extended query protocol, prepared statements and portals, COPY in and out, server-side cursors, LISTEN / NOTIFY, savepoints, and two-phase commit durable across a restart.

One thing on that list changed late enough to be worth calling out, because we had it documented wrongly on this very site until yesterday. A column-level UNIQUE used to be accepted and then never enforced — a duplicate went in silently where PostgreSQL answers 23505. That is data corruption rather than a missing feature, and it is fixed: every shape of it — column-level, table-level, multi-column, named constraint — now raises PostgreSQL's own error, down to the DETAIL: Key (code)=(dup) already exists. line.

Two gaps are still real and still deliberate. CREATE INDEX is refused outright rather than accepted and ignored, so you find out in one run instead of in a slow query six months later. And the server does not verify passwords — a role's SCRAM verifier is stored and never checked, so a wrong password and no password both connect. Keep it on loopback, and keep production data out of it. The project's rule is a faithful "not supported" over a half-implemented feature that diverges quietly; UNIQUE is what it looks like when something slips through that rule, which is why it went in the open backlog rather than being left for you to discover.

The site has been rebuilt around all this. The two Rust servers lead now — the MongoDB one and the PostgreSQL one — with the pure-Python implementation presented as what it has actually been for a while: the reference the Rust ports are held to, the readable one, the place every operator and error message lands first. Reach for Rust to run it; reach for Python to read it.

Rust PostgreSQL server · Download the binaries · The SQL interface