Skip to main content

NEDB — a versioned, self-compressing, time-traveling embedded database (replay-protected, idempotent, relational, searchable).

Project description

NEDB

A versioned, self-compressing, time-traveling embedded database.

Replay-protected · idempotent · relational · filterable · sortable · searchable · provable. One Rust core → ships to PyPI and npm from a single source.


Why NEDB

Redis is fast because it's in-memory and simple — but relations are hand-rolled, history is gone the moment you overwrite, and every call pays a network hop. NEDB keeps the speed and adds the things real systems actually need:

  • Faster-than-Redis latency where it's honest to claim it — NEDB runs embedded, in-process, so point reads pay no socket hop. The networked server (nedbd, RESP-compatible) competes on the Rust core's merits.
  • Replay protection + idempotency in the core, not the app. Every write carries a strictly-monotonic per-client nonce and an optional idempotency key. Retries are no-ops; stale/out-of-order ops are rejected. This is built into one hash-chained, append-only log.
  • Time-travel. Read the database exactly as it existed at any past sequence — AS OF seq. Debugging, audit, MVCC snapshots, and deterministic replay all fall out of the same log.
  • First-class relations. Adjacency-list graph edges with O(1) traversal — and the graph time-travels too.
  • Filter / sort / search. Equality, ordered, and full-text inverted indexes, maintained incrementally.
  • git-style files with maximum compression. Content-defined chunking + content-addressed dedup + temperature tiers (fast warm codec, max-ratio cold archival). Every file version has a Merkle root you can anchor on-chain.

The keystone: one nonce-enforced append-only log is the substrate for idempotency, replay protection, crash recovery, MVCC, and time-travel — simultaneously.


Quickstart (Python reference engine — runs today, zero build)

git clone https://github.com/interchained/nedb && cd nedb
pip install -e .                 # pure-Python reference; no toolchain needed
python3 examples/demo.py         # see every feature
python3 tests/test_nedb.py       # 10/10 invariants
from nedb import NEDB

db = NEDB()
db.create_index("users", "status", "eq")
db.create_index("users", "age", "ordered")
db.create_index("users", "bio", "search")

db.put("users", "alice", {"name": "Alice", "age": 31, "status": "active",
                          "city": "Austin", "bio": "rust systems hacker"})

# Idempotent, replay-protected write (safe to retry forever):
db.put("orders", "o1", {"total": 42}, client="checkout", nonce=7, idem="charge-o1")

# NQL — filter + sort
db.query('FROM users WHERE age >= 25 AND status = "active" ORDER BY age DESC')

# Full-text search
db.query('FROM users SEARCH "rust"')

# Relations + graph traversal
db.link("users:alice", "follows", "users:bob")
db.q("users").where("_id", "=", "alice").traverse("follows").run()

# Time-travel
s = db.seq
db.put("users", "alice", {"name": "Alice", "city": "Lisbon", "age": 31, "status": "active"})
db.get("users", "alice", as_of=s)["city"]      # -> "Austin"

# git-style files with Cascade compression + provable history
v1 = db.put_file("notes.txt", open("notes.txt","rb").read())
db.file_root("notes.txt", v1)                  # Merkle root — anchorable on ITC

NQL — the NEDB Query Language

One small grammar; the Rust parser is the single source of truth so Python and Node share identical semantics. A fluent builder compiles to the same plan.

FROM <collection>
  [ AS OF <seq> ]
  [ WHERE <field> <op> <value> (AND ...)* ]      op ∈ = != < <= > >=
  [ SEARCH "<text>" ]
  [ ORDER BY <field> [ASC|DESC] ]
  [ TRAVERSE <relation> ]
  [ LIMIT <n> ]

What's measured (reference engine, pure Python, 2 vCPU)

Operation Result
GET (embedded, in-process) ~1.2M ops/s (~800 ns/op)
SET (logged + indexed) ~77K ops/s
Indexed query latency ~75 µs
File compression — warm (zlib stand-in) 39.9×
File compression — cold (LZMA archival) 88.9×
Cross-version dedup 20 of 22 chunks reused on edit

The reference engine proves the architecture. The Rust core (rust/) is the speed target — see bench/bench_redis.py for the embedded-vs-Redis harness.


Architecture

            ┌──────────────────────────────────────────────┐
  put/del → │  OpLog  (append-only · BLAKE3 hash chain ·    │ ← single source of truth
  link      │          per-client nonce · idempotency keys) │
            └───────────────┬──────────────────────────────┘
            deterministic fold │ (state = pure function of the log)
        ┌──────────────┬───────┴────────┬───────────────────┐
        ▼              ▼                ▼                   ▼
   MVCC store     Relations         Indexes            BlobStore (Cascade)
   (time-travel)  (graph, AS OF)    eq/ordered/search  CDC+dedup+tiers, Merkle roots

One Rust core (nedb-core) → PyO3 wheels (PyPI) and napi-rs binaries (npm), plus a future nedbd server (RESP-compatible) and a WASM build for browser/edge.

Full design: docs/SPEC.md.


Repo layout

nedb/            pure-Python reference engine (this is what `pip install` ships today)
rust/            production core — nedb-core + nedb-py (PyO3) + nedb-node (napi-rs)
examples/demo.py end-to-end walkthrough
tests/           invariant tests
bench/           embedded micro-bench + Redis head-to-head harness
docs/SPEC.md     architecture specification
.github/         release CI → PyPI + npm on tag

Roadmap

  • Reference engine: log, MVCC, relations, indexes, NQL, Cascade, Merkle
  • Rust core parity + criterion benches + cargo test
  • PyO3 wheels + napi-rs binaries published on tag
  • nedbd server: RESP-compatible + native protocol
  • Similarity-picked deltas + schema-aware columnar transforms
  • On-chain (ITC) root anchoring; WASM build

License

Apache-2.0. Part of the Interchained ecosystem.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nedb_engine-0.1.0.tar.gz (23.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

nedb_engine-0.1.0-py3-none-any.whl (22.2 kB view details)

Uploaded Python 3

nedb_engine-0.1.0-cp38-abi3-win_amd64.whl (191.8 kB view details)

Uploaded CPython 3.8+Windows x86-64

nedb_engine-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (293.2 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

nedb_engine-0.1.0-cp38-abi3-macosx_11_0_arm64.whl (254.6 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file nedb_engine-0.1.0.tar.gz.

File metadata

  • Download URL: nedb_engine-0.1.0.tar.gz
  • Upload date:
  • Size: 23.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for nedb_engine-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bacbed632f7ef31f187fc90ba26fc0ee14e3438bd901234e844a9fd6634532d8
MD5 888528daa73ea62c63dc5d6d51836cd9
BLAKE2b-256 7ea6b66db8caeb75fd691e364f16f5844bd9b7dfdcdde66f3e51ba9428a047d6

See more details on using hashes here.

File details

Details for the file nedb_engine-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: nedb_engine-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for nedb_engine-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 33c18b62080a513c00dd7e47082a195f60ff72f55f021f148c47f01b4f87ce22
MD5 c362eb24712b40914b7456e6b05c0697
BLAKE2b-256 2d85cc5ca054a16a0d8a3861e558cf485c80ad6281bd52cfddd1035b8c87b563

See more details on using hashes here.

File details

Details for the file nedb_engine-0.1.0-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: nedb_engine-0.1.0-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 191.8 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for nedb_engine-0.1.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 971ad50a727987bd4e8c5fd0148c3d24f45622736b83a67bf92abef00b27cc4b
MD5 a02178cf725d384008a13eb911319ad1
BLAKE2b-256 6bbe5941ee3ac061ed2b75e152d01938d08f21abf6ce88f73d3553101312fc7a

See more details on using hashes here.

File details

Details for the file nedb_engine-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nedb_engine-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d2851476dde81fcaefb353e76caeb8c4407cce09136123c5dd21340cc6c76230
MD5 aea9ece5b076e4e5024a39015d3dda4c
BLAKE2b-256 c48d822ae54e15f6298a2119b4dec36465e7e3236f0195580071a17de074ebf4

See more details on using hashes here.

File details

Details for the file nedb_engine-0.1.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nedb_engine-0.1.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5913f2dca4e5d689888c4cd45bd30db85abf26e0a42822b28af6bebc1eb7d1e3
MD5 78cdf7452e7b990bb6deadb7763e1cee
BLAKE2b-256 9d5ac7a64d9b99076f56faf7307b65a8e728ed0baab86d7e1ba41229b5755230

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page