Foldlite DB
Immutable documents. Rebuildable live views. Rust and WebAssembly.
Foldlite DB is a CouchDB-inspired map/reduce engine built around a simple rule: keep immutable documents, derive everything else. The Rust engine appends accepted document batches to a durable log. Indexes, source checkpoints, group states, and change history form a disposable cache that can be reconstructed from that log. There is one native implementation, exposed to Python; storage needs no database server or external database library.
Write a view in AssemblyScript and compile it to WebAssembly. The same module maps and reduces documents in Rust or entirely in a browser worker. Try the browser playground or read the view authoring guide.
Install
Use Python 3.11+ to install the 0.1.0 release:
python -m pip install foldlitedb==0.1.0
Native wheels are provided for Linux x86-64 and ARM64, macOS Intel and Apple Silicon, and Windows x86-64. Installing a matching wheel needs neither Rust nor Node. The hosted documentation describes the API and bundled portable views.
Build from this checkout
Building from source requires Python 3.11+, Rust/Cargo 1.90+, and a platform C compiler and linker. From the repository root:
python -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install .
python examples/portable_metrics.py
On Windows, activate with .venv\Scripts\activate and use an MSVC build
environment. Node.js is unnecessary for installation and bundled views. To make
a wheel, run python -m pip wheel . --no-deps --wheel-dir dist. Install that
wheel on a matching platform with python -m pip install /path/to/the-built.whl;
installing a built wheel needs neither Rust nor Node. See the
release guide for PyPI Trusted Publisher setup and the
0.1.0 publication workflow.
Append documents, read a live view
Start with a fresh metrics.fold file:
from foldlitedb import Database, View
view = View.bundled("metrics")
with Database("metrics.fold", view) as db:
documents = db.add_many([
{"metric": "loss", "value": 4},
{"metric": "loss", "value": 8},
])
assert list(db.rows())[0].result == {
"count": 2, "sum": 12, "min": 4, "max": 8, "mean": 6,
}
snapshot = db.query()
documents += (db.add({"metric": "loss", "value": 3}),)
assert db.changes(since=snapshot.cursor).rows[0].result["mean"] == 5
retained = tuple(db.documents())
db.checkpoint()
Rust executes both map and reduce through a bounded Wasm interpreter. metrics
groups finite numbers by a string metric; catalogue demonstrates an ordered
fold over structured events. Each database holds one view module. Database and
View are the primary Python names; PortableDatabase and PortableView are
aliases for the same types.
Try the telemetry collector for bulk import, retries, and
a persistent changes consumer, or the catalogue example
for an ordered item lifecycle. If a payload produces no rows, inspect its map
output with db.preview(payload).
Every unnamed append creates a new observation. Give an observation an ID when identical retries should count once. IDs and positions are scoped to a source; conflicting reuse raises an error. Documents cannot be updated or deleted. Append new observations to represent changes, then let the view fold their history.
add_many commits one atomic batch of at most 1024 documents. Its complete Wasm
map request must fit 256 KiB, so larger payloads need smaller batches.
rows() follows a stable snapshot in bounded pages; query() and
changes(since=...) expose continuation cursors. See the
Python API for signatures and limits.
A log you keep; a cache you can discard
For a persistent database, metrics.fold contains the immutable document log.
metrics.fold.cache is an optional checkpoint; metrics.fold.lock coordinates
one active owner. A batch is acknowledged after its log frame is synced. The
engine validates and computes a batch before appending it, so a map or reducer
failure does not commit a prefix.
checkpoint() writes an atomic cache snapshot; closing cleanly does the same.
On reopen, the engine verifies the log and matching cache prefix, then runs Wasm
only for batches after the checkpoint. Missing, corrupt, or incompatible caches
are rebuilt from the documents. rebuild() explicitly recomputes the view and
starts a new cursor generation. Neither operation changes the source documents.
The document log is independent of the view module. Opening it with different module bytes rebuilds the cache in place; retain the exact module if you need to reproduce its previous results. Close the database before backing up the log and view artifacts; Windows locks prevent other handles from reading an active log. The cache is replaceable; the only copy of a document log is not.
Rebuild uses the original batch order. It scans the log linearly and runs each uncached batch through the same map/reduce path as live ingestion. A valid cache avoids repeated Wasm work, but reopening still verifies the complete log. Current indexes and history grow in memory with the data. Cache snapshots are limited to 1 GiB of encoded checkpoint data; a checkpoint or close error reports a failure to save that accelerator, while committed log data remains intact. There is no claim of constant memory or measured rebuild throughput.
To copy retained records into a fresh database:
with Database("copy.fold", view) as copied:
copied.ingest(retained)
assert list(copied.rows())[0].result["mean"] == 5
before = [(r.key, r.state, r.result) for r in copied.rows()]
copied.rebuild()
assert [(r.key, r.state, r.result) for r in copied.rows()] == before
Use ingest_many(records, batch_size=100) for larger archives. Iterate its
results to perform the import: each yielded result commits one separate bounded
batch, and earlier batches remain committed if a later batch fails. See the
retry-safe source import for constructing records with
upstream positions or stable IDs alone. Preserve record order; preserve original
batch boundaries too if you need identical engine sequence values.
Author a view, run it on a website
The AssemblyScript SDK provides JSON helpers and the Wasm ABI.
Implement map, identity, add, and finalize; implement merge only for
states that can be combined correctly. Inputs and state are explicit, and views
must be deterministic. An ordered fold must give equivalent state when the same
contributions are split across successive batches.
Rebuild the two bundled examples with Node.js 20+:
npm ci --prefix views
npm run build --prefix views
npm test --prefix views
npm run check --prefix views
The build writes modules and SHA-256 manifests into
src/foldlitedb/portable_assets/. It builds the named metrics and catalogue
examples. Compile a custom view and generate its manifest with:
npm run build:view --prefix views -- assembly/examples/my-view.ts --out-dir .build
Both paths are relative to views/. The
authoring guide includes a complete custom view
and the build command to generate its Wasm and digest manifest.
foldlitedb.portable_assets() exposes compiled modules plus client.js,
worker.js, and host.js. Copy them to a static site and import
BrowserDatabase from client.js. The browser example
covers appends, snapshots, changes, export, and replay verification. JavaScript
owns in-memory grouping and storage in the browser worker; the Rust log engine
is not compiled into this browser build.
Browser state is lost on reload or close. Export resolved documents first. The preview bounds documents, groups, history, and request sizes. Persistent browser storage, log/history compaction, and multiple views per native database remain future work. JSON numbers use IEEE-754 double precision; use strings for exact arbitrary-precision identifiers.
Development and documentation
python -m pip install '.[dev,browser]'
python -m playwright install chromium
python -m pytest
python -m pytest tests/browser
cargo test --locked --manifest-path native/Cargo.toml -p foldlitedb-portable-engine
npm ci --prefix views
npm test --prefix views
npm run check --prefix views
python scripts/build_docs.py
python scripts/check_docs.py --execute --browser
python -m http.server 8000 --directory _site
The docs checker executes annotated Python examples in fresh temporary
directories and checks links, search, and desktop/mobile rendering in Chromium.
Open http://localhost:8000 for the built docs and playground. An authorized
maintainer can publish checked generated docs with
python scripts/publish_docs.py; building alone does not publish them.
Measure the native path on your target filesystem with:
python scripts/benchmark_database.py --documents 10000 --keys 16 --batch-size 100 --live-documents 20 --output native-benchmark.json
Use --storage-root /path/to/filesystem to select the filesystem being measured.
The report compares durable ingestion, checkpointing, cached reopen, suffix
replay, and full reconstruction, while checking unchanged log bytes and matching
results. Local measurements describe that fixture and host.
See DESIGN.md for durability, replay, cache validation, and execution contracts.
Metadata
Release files for foldlitedb 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| foldlitedb-0.1.0.tar.gz | 253.5 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| foldlitedb-0.1.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| foldlitedb-0.1.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| foldlitedb-0.1.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| foldlitedb-0.1.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
| foldlitedb-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl | CPython 3.11 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 6.5 MB
Release files / foldlitedb-0.1.0.tar.gz
| Download URL | foldlitedb-0.1.0.tar.gz |
|---|---|
| Size | 253.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b09f542fa38c80160695aecae7b303ebef698d6cdb537e7e6bb9568f8787759
|
|
BLAKE2b-256 checksum How to use checksums |
c5e69ad1bb045da398ec2a3962be90637d90c0ac00dd90f9057e4df87a1dd7d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / foldlitedb-0.1.0-cp311-abi3-win_amd64.whl
| Download URL | foldlitedb-0.1.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c099da797ba3b1f071de13f0476af2f542af46e4100698a094543d9bd32dd64f
|
|
BLAKE2b-256 checksum How to use checksums |
eb9122fdf5a671059ed8d4e5a4a9fa79078f2ad67931e67d48b1ec840fc13e57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / foldlitedb-0.1.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | foldlitedb-0.1.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
11e3f11f32925bcb946a3c5001e80ef77b83d59473f1befa105ee93ba11f0770
|
|
BLAKE2b-256 checksum How to use checksums |
efe0076f495a3ffd67896d27fcafe3108b3f1cd69a648f6f0028837997cd3958
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / foldlitedb-0.1.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | foldlitedb-0.1.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
d1c93a16b72a152af5ddcd6c89b05125c96cac1a0100059b188d01b5f2cd8338
|
|
BLAKE2b-256 checksum How to use checksums |
b86f771debe1fb9e7f2971e11e997aa5f41cb0944e7375d173a35b407cd94fe4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / foldlitedb-0.1.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | foldlitedb-0.1.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3404d144ae2391a759d9181d7a901ce5902bcce46b833d474e37f320666daa8f
|
|
BLAKE2b-256 checksum How to use checksums |
bb3b8b46846fd9943ec6f30876cd2361112549d9c5f973dd8c665f9025bd1a82
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / foldlitedb-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl
| Download URL | foldlitedb-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.11 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
57e8f4626a2b14e078fb8d077141e2a04d6319e5512ce19264f1054ea5508e4c
|
|
BLAKE2b-256 checksum How to use checksums |
11f7befd501c1530cb7f367a4bf4a24feb2f0da9ceefcfd8438fa3b3fdb993e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for foldlitedb 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for foldlitedb-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.