Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
37d0086
docs: align README and guides with current behavior and array functio…
farhan-syah Oct 16, 2026
017d8f1
perf(codec): read double-delta bit fields a byte at a time
farhan-syah Oct 16, 2026
df0dbba
feat(spatial): tag geometries with an SRID and add CRS transforms
farhan-syah Oct 16, 2026
a20e333
feat(array): load and read arrays as SQL relations
farhan-syah Oct 16, 2026
44c72e5
docs(array): align array guides with the current DDL, DML, and functi…
farhan-syah Oct 16, 2026
47f18cf
docs(spatial): document SRIDs and CRS transforms
farhan-syah Oct 16, 2026
1549386
fix(document): end a streamed scan in an error frame when the respons…
farhan-syah Oct 16, 2026
7f6e1cd
feat(array): run region aggregates, elementwise ops, and maintenance …
farhan-syah Oct 16, 2026
723174d
feat(codec): add Gorilla XOR encoding for f32 columns
farhan-syah Oct 16, 2026
9557931
feat(array): support narrow integer and f32 attribute types
farhan-syah Oct 16, 2026
58dab5b
docs(array): document narrow attribute types and typed aggregate results
farhan-syah Oct 16, 2026
b881e66
fix(array): parse NOT NULL on array attributes
farhan-syah Oct 16, 2026
58d141a
fix(pgwire): refuse startup errors with FATAL severity
farhan-syah Oct 16, 2026
6d308c4
docs: pass the built-in database name in psql examples
farhan-syah Oct 16, 2026
f4a6f53
fix(sql): shape aggregate and computed output, refuse redacted expres…
farhan-syah Oct 17, 2026
c1e5d02
fix(calvin): answer a routed write's stage refusal with its own error
farhan-syah Oct 17, 2026
741e1e5
fix(write-admission): fence a new Calvin scheduler behind earlier adm…
farhan-syah Oct 17, 2026
c07b9cc
fix(array): type aggregate output and write timestamp groups as instants
farhan-syah Oct 17, 2026
e37cddf
perf(array): build shard buckets flat and key tiles once per run of c…
farhan-syah Oct 17, 2026
cfb21f2
fix(sql): bind grouped select items to group keys and refuse ungroupe…
farhan-syah Oct 17, 2026
6d4923a
fix(pgwire): report parse-analysis errors at Parse
farhan-syah Oct 17, 2026
fa6170b
refactor(audit): flush audit entries through a WAL-backed buffer, ind…
farhan-syah Oct 17, 2026
680e093
fix(array): refuse non-numeric reducers at plan time and type the gro…
farhan-syah Oct 17, 2026
935970d
fix(auth): route every bearer JWT login through one audited gate
farhan-syah Oct 17, 2026
37473cc
docs: document bearer audit events, typed ARRAY_AGG results, and Pars…
farhan-syah Oct 17, 2026
ae69d77
perf(audit): share WAL syncs across concurrent audit recorders
farhan-syah Oct 17, 2026
2d77faa
fix(array): bound attr column decode by the tile's live row count
farhan-syah Oct 18, 2026
c0b02d9
fix(codec): bound the gorilla f32 decode capacity
farhan-syah Oct 18, 2026
f570feb
fix(ci): point the robust-parsing gate at the split wkb reader
farhan-syah Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 5 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ cargo install nodedb
Requires Linux kernel >= 5.1 (io_uring). Connect:

```bash
ndb # native CLI (connects to localhost:6433)
psql -h localhost -p 6432 # or any PostgreSQL client
ndb -w # native CLI as user nodedb on localhost:6433, prompts for the password (or set NDB_PASSWORD)
psql -h localhost -p 6432 -U nodedb -d default # password: <data_dir>/.superuser_password, or set NODEDB_SUPERUSER_PASSWORD
```

```sql
Expand Down Expand Up @@ -164,7 +164,7 @@ See [NodeDB-Lite](https://github.com/NodeDB-Lab/nodedb-lite) for platform detail

**Write-time validation** -- Typeguards enforce types, required fields, CHECK constraints, and DEFAULT/VALUE expressions on schemaless collections. Graduate to strict schema with `CONVERT COLLECTION x TO document_strict`.

**Bitemporal queries** -- System time (audit trail) and valid time (temporal semantics) across all engines. Query data as it existed in the past, or as it was valid on a past date. GDPR-compliant tile purge on array engine.
**Bitemporal queries** -- System time (audit trail) and valid time (temporal semantics) on Document, Columnar, Timeseries, Graph and Array. Vector, Full-Text, Spatial and KV indexes reach time through the collection they index. Query data as it existed in the past, or as it was valid on a past date. GDPR-compliant tile purge on array engine.

**Multi-dimensional arrays** -- Scientific computing with Z-order indexed tiles, tile-level compression, and bitemporal support. Combine with vector/graph/text in fused queries via cross-engine identity.

Expand Down Expand Up @@ -214,11 +214,9 @@ cargo nextest run --all-features

## Release Status

NodeDB Origin is in **public beta**; the current release is **v0.5.0 (2026-08-04)**. All eight engines are feature-complete and covered by tests. The query-facing wire protocols (pgwire, HTTP, native MessagePack, RESP) are stable — clients written against 0.1.0 will keep working through 1.0. The CRDT sync protocol and ILP ingest are still moving: 0.5.0 changes the sync frame and requires authentication on ILP connections, so upgrade NodeDB Lite and ingest clients together with the server.
NodeDB Origin is in **public beta**; the current release is **v0.6.2 (2026-10-16)**. All eight engines are feature-complete and covered by tests. Server binaries, Docker images and the crates.io crates ship at the same version. The CRDT sync protocol and the native protocol still change between minor releases, so upgrade NodeDB Lite and `nodedb-client` together with the server.

v0.5.0 ships as server binaries and Docker images; the crates.io publication follows separately, so `cargo add` still resolves 0.4.0 for now. Library users who need the 0.5.0 fixes today can depend on the `v0.5.0` tag by git.

**v0.5.0 — Beta (today).** Build new products on it. The public surface (SQL dialect, query wire protocols, configuration) is stable; expect internal changes (storage layout, on-disk format, replication internals) between minor releases — a 0.4.0 data directory needs a dump/reload to move to 0.5.0. Patch and minor bumps land as needed — 0.2 through 0.5 shipped as the work demanded. The beta period is deliberately for real workloads to surface edge cases we can't manufacture in-house.
**v0.6 — Beta (today).** Build new products on it. Expect internal changes (storage layout, on-disk format, replication internals) between minor releases: a 0.5.0 data directory cannot be opened by 0.6, so start 0.6 on an empty directory. Patch and minor bumps land as needed. The beta period is deliberately for real workloads to surface edge cases we can't manufacture in-house.

**v1.0.0 — Production-ready (target: after the beta hardening period).** What 1.0 guarantees:

Expand Down
207 changes: 161 additions & 46 deletions docs/array.md

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions docs/bitemporal.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,19 +115,19 @@ Retrieve array cells as they existed at a point in time:
-- Multidimensional scientific data with temporal audit trail
CREATE ARRAY climate_grid
DIMS (
lon INT32 DOMAIN [-180, 180),
lat INT32 DOMAIN [-90, 90)
lon INT64 [-180..180],
lat INT64 [-90..90]
)
ATTRS (
temp_c FLOAT32
temp_c FLOAT64
)
TILE_EXTENTS (64, 64)
WITH (audit_retain_ms = 7776000000); -- 90 days

-- Query cells as they were committed yesterday
SELECT lon, lat, temp_c FROM ARRAY_SLICE(
'climate_grid',
{lon: [-10, 10), lat: [0, 20)},
'{lon: [-10, 9], lat: [0, 19]}',
['temp_c']
)
AS OF SYSTEM TIME '2026-06-06T00:00:00Z';
Expand Down Expand Up @@ -162,7 +162,7 @@ AS OF SYSTEM TIME NULL -- returns every system-time version, ascending
ORDER BY _ts_system ASC;
```

`AS OF SYSTEM TIME NULL` returns every system-time version of each matching row, ordered ascending. Each version row carries the user columns plus three synthetic temporal columns: `_ts_system`, `_ts_valid_from`, and `_ts_valid_until`. Unbounded valid-time ends surface as the raw `i64::MIN` / `i64::MAX` sentinels (matching the Columnar and Timeseries engines). It is supported on the Document (strict and schemaless), Columnar, and Timeseries engines. It is not supported on the Graph or Array engines, nor when reading through a database clone — those return a typed error rather than collapsing to a single version.
`AS OF SYSTEM TIME NULL` returns every system-time version of each matching row, ordered ascending. Each version row carries the user columns plus three synthetic temporal columns: `_ts_system`, `_ts_valid_from`, and `_ts_valid_until`. Unbounded valid-time ends surface as the raw `i64::MIN` / `i64::MAX` sentinels (matching the Columnar and Timeseries engines). It is supported on the Document (strict and schemaless), Columnar, and Timeseries engines, and on `ARRAY_SLICE`. An `ARRAY_SLICE` version row carries the dimension and attribute columns plus `_ts_system` only. It is not supported on the Graph engine or on `ARRAY_AGG`, nor when reading through a database clone — those return a typed error rather than collapsing to a single version.

`AS OF` reads run at parity with non-temporal reads: `WHERE` predicates (including on strict Binary-Tuple collections), `ORDER BY`, computed columns, and window functions all apply to temporal queries.

Expand Down
2 changes: 1 addition & 1 deletion docs/databases.md
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ This allows safe retry after network failures without duplicating the move.
### Per-Database Audit Filtering

```sql
SHOW AUDIT IN DATABASE staging [WHERE event_type = 'database_quota_changed'];
SHOW AUDIT IN DATABASE staging [WHERE event_type = 'database_quota_changed'] [LIMIT n];
```

Events tagged with `database_id` include: `DatabaseCreated`, `DatabaseDropped`, `DatabaseRenamed`, `DatabaseQuotaChanged`, `DatabaseCloned`, `DatabaseMirrored`, `DatabasePromoted`, `TenantMoved`, etc.
Expand Down
8 changes: 6 additions & 2 deletions docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -726,17 +726,21 @@ An env override still wins over an expanded value for the same field.
### With the `ndb` CLI

```bash
./target/release/ndb
./target/release/ndb -w
```

`ndb` connects to `127.0.0.1:6433` as user `nodedb`. The server runs in password mode by default, and `ndb` sends no password unless given `-w`, which prompts for it. Set `NDB_PASSWORD` to skip the prompt. `NDB_USER` and `NDB_DATABASE` set the user and database.

You get a full TUI with syntax highlighting, tab completion, and history search. See the [CLI guide](cli.md) for details.

### With psql

```bash
psql -h localhost -p 6432
psql -h localhost -p 6432 -U nodedb -d default
```

The server starts in password mode with the superuser `nodedb`. Set `NODEDB_SUPERUSER_PASSWORD` before the first start, or read the generated password from `<data_dir>/.superuser_password`. `-d default` names the built-in database. Without it, psql asks for a database named after the user, and the server refuses the connection with `3D000`.

NodeDB speaks PostgreSQL's wire protocol, so standard tools like `psql`, ORMs, and BI tools work out of the box.

### With the Rust SDK or FFI
Expand Down
8 changes: 4 additions & 4 deletions docs/protocols.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ NodeDB speaks six wire protocols. All SQL-capable protocols share the same query
Standard PostgreSQL wire protocol. Any tool that speaks Postgres works with NodeDB.

```bash
psql -h localhost -p 6432
psql -h localhost -p 6432 -U nodedb -d default

# Or any Postgres-compatible client
# JDBC, libpq, SQLAlchemy, Prisma, etc.
Expand Down Expand Up @@ -76,11 +76,11 @@ Use SQL for complex queries, ad-hoc exploration, and rapid prototyping. Use nati
**Connection:**

```bash
# ndb CLI connects automatically
./target/release/ndb
# ndb CLI: user nodedb, port 6433, -w prompts for the password (or set NDB_PASSWORD)
./target/release/ndb -w

# Or specify host
./target/release/ndb --host localhost --port 6433
./target/release/ndb --host localhost --port 6433 -w
```

## HTTP API
Expand Down
Loading
Loading