The SQLite of document databases — one database, two implementations.

SecantusDB is a real MongoDB server backed by the same WiredTiger engine MongoDB uses — it speaks the MongoDB wire protocol on the same TCP socket a mongod would, so any standard driver connects unchanged. Pick your runtime: Python DB, the embeddable reference with the broadest surface and a SQL/PostgreSQL frontend, or Rust DB, the same database as one dependency-free static binary.

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.

Two implementations, one wire protocol

Both speak the same MongoDB wire protocol, pass the same unmodified driver gauges, and persist through the same WiredTiger storage — a data directory written by one opens in the other. Pick the runtime that fits your stack, not a different database.

Python

Python DB

The reference implementation — the broadest feature surface, easy to read and patch, and embeddable in two lines from any test or app.

  • Pure-Python request path — hackable and extensible
  • pip install SecantusDBSecantusDBServer(...)
  • Where every new operator and stage lands first
  • SQL/PostgreSQL frontend — the same data over psql

Meet the Python DB →

Rust

Rust DB

A whole second server written in Rust — wire, dispatch, cursors, and WiredTiger storage — for raw speed and a single standalone binary with no Python in the request path.

  • Ships as one static-WiredTiger binary: secantusd-rs
  • No Python required — built for CI, containers, any stack
  • GIL-free accept loop — and still embeddable from Python
  • Measured at ~0.8×–2.1× of mongod per op — ~4–14× faster than the Python DB

Meet the Rust DB →

Drop-in for pymongo

Same wire protocol, same handshake, same error codes — against either implementation. The application code is byte-identical; only the setup line changes.

Normal MongoDB requires mongod running on :27017
from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017")
db = client["mydb"]
db["users"].insert_one({"_id": 1, "name": "Joe"})
assert db["users"].find_one({"_id": 1})["name"] == "Joe"
Embedded SecantusDB no external process — in your test or app
from pymongo import MongoClient
from secantus import SecantusDBServer

with SecantusDBServer(port=27017) as server:
    client = MongoClient(server.uri)
    db = client["mydb"]
    db["users"].insert_one({"_id": 1, "name": "Joe"})
    assert db["users"].find_one({"_id": 1})["name"] == "Joe"

With a console in the box

One command opens a local web UI over whatever server you already have running — SecantusDB or a real mongod. Browse collections, watch live throughput, read a query plan, tail a change stream, manage users, take a backup. It's loopback-only and token-gated, and every script and stylesheet ships inside the package.

The SecantusDB admin dashboard: uptime, connection and request tiles above four per-second operation sparklines.
Live server metrics, sampled once a second over a websocket.
The admin Query page running a find, with results below the form.
Run find, aggregate or any command
The admin change-stream tail showing live insert, update and delete events.
Tail a change stream live
The admin explain view showing a winning query plan stage by stage.
See which index a query really used

Every major MongoDB driver works

SecantusDB is validated against the official driver test suites, unmodified — the same tests the driver maintainers run against a real mongod. Twelve driver gauges — Python (sync and async), Java, Node.js, Go, Ruby, Rust, PHP (library and C extension), C, C++, and C#/.NET. One wire protocol. pymongo is the headline gauge: it runs the broadest in-scope set, which makes it the most honest single number. The rest run curated, in-scope subsets in each driver's own language — their job is to catch wire-protocol bugs pymongo's permissive client accepts silently (cursor IDs that must be int64, strict type decoding), not to pile up a bigger count. Where a gauge sits below 100%, the shortfall is out-of-scope surface (text / hashed indexes, server-side $where JavaScript, multi-node assumptions) rather than a gap in the CRUD, aggregation, or change-stream behaviour that test and dev work depends on — each panel links its full report.

pymongo

Python
99.5% pass rate

1021 tests passed · 5 failed

The official MongoDB Python driver, and the deepest suite we run — so it surfaces the long tail. The remaining failures are features outside a single node's scope (text / hashed indexes, server-side $where JavaScript), tests that assume a multi-node cluster, and a few driver-side harness artifacts — not gaps in the CRUD, aggregation, or change-stream surface that test and dev rely on. We run pymongo's own tests, unmodified, against an embedded SecantusDB.

Read the report →

pymongo (async)

Python / asyncio
99.4% pass rate

926 tests passed · 6 failed

pymongo's native AsyncMongoClient suite — the async/await wire path that replaced Motor. Same unmodified upstream tests as the sync gauge, run under pytest-asyncio against the same embedded SecantusDB, so the non-blocking client is held to the same bar rather than assumed to follow from the sync one. Remaining failures are the same out-of-scope surfaces (text / hashed indexes, server-side $where) plus a few timeout-introspection tests.

Read the report →

mongo-java-driver

Java
96.2% pass rate

430 tests passed · 17 failed

The driver enterprise MongoDB consumers most often use, and the foundation for many JVM-language wrappers. We run a curated subset of driver-sync/src/test/functional/ — integration tests that open a real connection to a SecantusDB daemon (the driver's own BSON codec unit tests are run but not counted here; they never touch the server). Type-strict decoders catch wire-shape divergences pymongo's permissive client accepts silently.

Read the report →

mongo-node-driver

Node.js
99.7% pass rate

358 tests passed · 1 known divergence

The official Node driver, and the same driver mongosh and the JavaScript ecosystem build on. We run a curated test/integration/ spec set via mocha --config test/mocha_mongodb.js — real wire commands against an embedded SecantusDB daemon.

Read the report →

mongo-go-driver

Go
100.0% pass rate

401 tests passed · 0 failed

The same driver mongodump and mongorestore are built on. We run ./internal/integration/... — the package that opens real mongo.Client instances and exchanges wire commands. Type-strict (int32 vs int64) bugs that pymongo accepts silently fail loudly here.

Read the report →

mongo-ruby-driver

Ruby
99.6% pass rate

258 tests passed · 1 known divergence

The official MongoDB Ruby driver (mongo + bson 5.x), the gem the Rails / Sinatra ecosystem builds on. We run a curated set of integration spec files end-to-end against an embedded SecantusDB daemon — every test opens a real Mongo::Client, SCRAM-authenticates as a pre-provisioned root-user, and exchanges wire commands.

Read the report →

mongo-rust-driver

Rust
100.0% pass rate

101 tests passed · 0 failed

The official MongoDB Rust driver — the basis for Tokio-async MongoDB consumers in Rust. We run a curated set of driver/src/test/ in-tree tests via cargo test --lib -p mongodb with MONGODB_URI explicitly overridden in the subprocess env, so the rust driver's fallback chain ($MONGODB_URI~/.mongodb_urilocalhost:27017) can't accidentally route to a real mongod.

Read the report →

mongo-php-library

PHP
98.2% pass rate

2145 tests passed · 39 failed

The official high-level PHP library — the mongodb/mongodb package Laravel and Symfony applications build on. We run its PHPUnit functional suite (Operation / Collection / Database / Command) end-to-end against an embedded SecantusDB daemon; the pure-code query-builder and BSON-comparator units are run but not counted here, since they never touch the server.

Read the report →

mongo-php-driver

PHP
100.0% pass rate

247 tests passed · 0 failed

The low-level PHP extension — the C-based PECL ext-mongodb that wraps libmongoc and underpins the library above. We run its .phpt wire-protocol suite via PHP's run-tests.php against an embedded SecantusDB daemon (the pure BSON-serialization tests are run but not counted). Alongside Go, the strictest wire-shape check we run — type divergences pymongo accepts silently fail here.

Read the report →

mongo-c-driver

C
98.6% pass rate

723 tests passed · 2 failed

The official MongoDB C driver (libmongoc) — the lowest-level official client, the one the PHP, Ruby (bson), and PyMongo C-extensions ultimately wrap. We build its test-libmongoc suite from source and run a curated set of wire-protocol prefixes (CRUD / cursor / aggregate / command / GridFS / index management) against an embedded SecantusDB daemon via MONGOC_TEST_URI. A strict C client — type and wire-shape divergences surface here that permissive clients accept.

Read the report →

mongo-cxx-driver

C++
100.0% pass rate

890 tests passed · 0 failed

The official MongoDB C++ driver (mongocxx), built on libmongoc. We build its Catch2 test_driver suite from source and run it (CRUD / cursor / aggregate / GridFS / commands) against an embedded SecantusDB daemon. mongocxx's tests hard-wire the driver default port, so the gauge serves them on 127.0.0.1:27017.

Read the report →

mongo-csharp-driver

C#
100.0% pass rate

202 tests passed · 0 failed

The official MongoDB C# / .NET driver — the one the .NET / Unity / Xamarin ecosystem builds on. We run its xUnit CRUD specification suite (MongoDB.Driver.Tests.Specifications.crud) via dotnet test against an embedded SecantusDB daemon, with MONGODB_URI pointed at it. The driver's [RequireServer] attribute self-skips version- and topology-gated cases.

Read the report →

Plus a cross-driver feature matrix: every shipped feature (auth, change streams, custom roles, sessions, geo, bulk writes, type fidelity…) is verified end-to-end through the Python / Java / Node / Go / Ruby / PHP drivers via dedicated smoke tests — so a wire-shape divergence that one driver is permissive about gets caught by another.

A note on the license: SecantusDB is GPL-2.0-only. The GPL's obligations apply when you distribute SecantusDB or a derivative of it — not when you run it. Your application talks to it through a standard MongoDB driver over the wire protocol, and a test/dev dependency you don't ship leaves your application's license untouched.