Data, connected. Versioned data with SQL, time travel, and cross-table ACID transactions.
Project description
Rhizo
From the rhizome — a root system with no center, where any point connects to any other.
In 1980, Deleuze and Guattari contrasted the rhizome with the tree: hierarchies vs networks, central authority vs emergent coherence. Traditional databases are trees — leaders, followers, coordination. Rhizo is rhizomatic: every node commits locally, consistency emerges mathematically.
The first database where coordination is optional.
| Metric | Rhizo | Industry Standard | Improvement |
|---|---|---|---|
| Transaction latency | 0.022ms | 100ms (consensus) | 31,000x faster |
| Energy per transaction | 2.2e-11 kWh | 2.1e-6 kWh | 97,943x less |
| Branch overhead | 280 bytes | 14.7 MB (Delta Lake) | 52,500x smaller |
| OLAP queries | 0.9ms | 23ms (DuckDB) | 26x faster |
The Problem
Distributed databases require consensus. Consensus adds latency, complexity, and energy cost — even when the operation doesn't need it.
Lakehouses (Delta Lake, Iceberg, Hudi) improve storage but can't solve:
| Limitation | What It Costs You |
|---|---|
| Single-table transactions | No atomic updates across related data |
| No deduplication | Paying for storage you don't need |
| No real branching | Can't experiment without copying everything |
| Consensus overhead | 100ms+ latency on every write |
Rhizo can.
Benchmarks
OLAP Performance vs Industry (100K rows)
With the new DataFusion-powered OLAP engine, Rhizo delivers industry-leading query performance:
| Metric | Rhizo OLAP | DuckDB | Delta Lake | Parquet | Winner |
|---|---|---|---|---|---|
| Read | 0.9ms | 23.8ms | 23.9ms | 6.3ms | Rhizo (26x) |
| Filtered (5%) | 1.2ms | 1.8ms | 19.9ms | 7.0ms | Rhizo |
| Projection | 0.7ms | 1.4ms | 14.5ms | 3.5ms | Rhizo (2x) |
| Complex Query | 2.9ms | 6.6ms | 30.5ms | 18.5ms | Rhizo (2.3x) |
| Storage | 3.67MB | 6.26MB | 63.10MB | 3.73MB | Rhizo (17x vs Delta) |
Rhizo wins 4/6 performance categories with built-in lakehouse features no competitor matches.
JOIN Performance (10K users x 100K orders)
| Operation | Rhizo OLAP | DuckDB | Delta Lake |
|---|---|---|---|
| Simple JOIN | 2.9ms | 7.5ms | 31.5ms |
| JOIN + Filter | 3.0ms | 5.9ms | 33.4ms |
| JOIN + Aggregate | 4.2ms | 5.6ms | 34.0ms |
Rhizo wins all JOIN categories.
Scale Performance (1M rows)
| Metric | Rhizo OLAP | DuckDB | Speedup |
|---|---|---|---|
| Read | 5.1ms | 257.2ms | 50x faster |
| Filter | 1.9ms | 14.2ms | 7.5x faster |
| Write | 415ms | 625ms | 1.5x faster |
Unique Features (No Competitor Has All)
| Feature | Rhizo | Delta Lake | DuckDB | Iceberg |
|---|---|---|---|---|
| OLAP Query Speed | Yes | No | Yes | No |
| Time Travel SQL | Yes (VERSION 5) |
API only | No | API only |
| Branch Queries | Yes (@branch) |
No | No | No |
| Changelog SQL | Yes (__changelog) |
No | No | No |
| Cross-table ACID | Yes | No | No | No |
| Content Dedup | Yes | No | No | No |
| Merkle Integrity | Yes | No | No | No |
| Arrow Chunk Cache | Yes (15x speedup) | No | No | No |
| Algebraic Merge | Yes (4M+ ops/sec) | No | No | No |
Core Operations
| Operation | Performance | Notes |
|---|---|---|
| OLAP read (cached) | 0.9ms | 26x faster than DuckDB |
| Arrow cache read | 0.24ms | 15x faster than uncached |
| Write throughput | 211 MB/s | Native Rust Parquet encoding |
| Branch creation | <10 ms | Zero-copy, 280 bytes overhead |
| Time travel query | 0.5ms | O(1) version lookup |
| Cache hit rate | 97.2% | LRU eviction, no invalidation |
Incremental Deduplication (Merkle Tree Storage)
| Change Percentage | Chunk Reuse | Storage Savings |
|---|---|---|
| 1% change | 98.8% reuse | ~49% vs naive |
| 5% change | 95.0% reuse | ~47% vs naive |
| 10% change | 90.0% reuse | ~45% vs naive |
O(change) storage instead of O(n) per version.
Feature Comparison
| Feature | Rhizo | Delta Lake | Iceberg | Hudi |
|---|---|---|---|---|
| Cross-table ACID | Yes | No | No | No |
| Zero-copy branching | Yes | No | No* | No |
| Global deduplication | Yes | No | No | No |
| Merkle tree dedup | Yes | No | No | No |
| Corruption detection | Built-in | External | External | External |
| Time travel | Yes | Yes | Yes | Yes |
| SQL Query Engine | Yes | Yes | Yes | Yes |
| Cloud Storage | Planned | Yes | Yes | Yes |
*Iceberg branching requires Nessie catalog
Quick Start
Installation
pip install rhizo
Basic Usage
import rhizo
import pandas as pd
# Open or create a database
db = rhizo.open("./mydata")
# Write data
df = pd.DataFrame({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"score": [85.5, 92.0, 78.5]
})
db.write("users", df)
# Query with SQL
result = db.sql("SELECT * FROM users WHERE score > 80")
print(result.to_pandas())
# Close when done
db.close()
Or use as a context manager:
with rhizo.open("./mydata") as db:
db.write("users", df)
result = db.sql("SELECT * FROM users")
Time Travel
# Query historical versions
result_v1 = db.sql(
"SELECT AVG(score) FROM users",
versions={"users": 1}
)
# Read specific version directly
old_data = db.read("users", version=1)
# Compare versions (via engine for advanced features)
diff = db.engine.diff_versions("users", 1, 2, key_columns=["id"])
Branching
# Access branching through the engine
engine = db.engine
# Create branch (instant, zero-copy)
engine.create_branch("experiment/new-scoring")
engine.checkout("experiment/new-scoring")
# Modify on branch (production unchanged)
db.write("scores", updated_df)
# Query both branches
main_result = db.sql("SELECT * FROM scores") # current branch
engine.checkout("main")
main_result = db.sql("SELECT * FROM scores") # main branch
# Merge when ready
engine.merge_branch("experiment/new-scoring", into="main")
Cross-Table Transactions
with db.engine.transaction() as tx:
tx.write_table("customers", updated_customers)
tx.write_table("orders", new_order)
tx.write_table("audit_log", audit_entry)
# All commit together, or all rollback
Architecture
Application Layer
Python (rhizo) | Rust | CLI (planned)
TableWriter | TableReader | QueryEngine (DuckDB)
|
v
FileCatalog
Versioned table metadata | Time travel queries | Atomic commits
|
v
ChunkStore
Content-addressed storage (BLAKE3) | Automatic deduplication
Atomic writes | Integrity verification
|
v
File System
2-level directory tree | JSON metadata | Parquet chunks
Current Status
| Phase | Description | Status |
|---|---|---|
| Phase 1: Storage | Content-addressable chunk store with BLAKE3 hashing | Complete |
| Phase 2: Catalog | Versioned file catalog with time travel | Complete |
| Phase 3: Query | DuckDB integration with SQL and time travel | Complete |
| Phase 4: Branching | Git-like branching with zero-copy semantics | Complete |
| Phase 5: Transactions | Cross-table ACID with recovery | Complete |
| Phase 6: Changelog | Unified batch/stream via subscriptions | Complete |
| Phase A: Merkle Storage | O(change) deduplication via Merkle trees | Complete |
| Phase P: Performance | Native Rust Parquet, parallel I/O | Complete |
All phases complete. 632 tests passing (370 Rust + 262 Python).
Performance Optimization Journey
| Phase | Optimization | Result |
|---|---|---|
| P.1 | Parallel chunk I/O (Rayon) | 3-5x batch throughput |
| P.2 | Memory-mapped reads | Infrastructure for zero-copy |
| P.3 | Parallel Parquet parsing | 2.1x multi-chunk speedup |
| P.4 | Native Rust Parquet encoder | 2.3x write improvement |
| P.5 | Arrow chunk cache | 15x faster repeated reads |
Phase P.5 leverages content-addressed storage for cache-friendly reads. Since chunk hashes never change, cached Arrow RecordBatches require no invalidation and are shared across tables, versions, and branches. Cache hits bypass both disk I/O and Parquet decoding.
Project Structure
rhizo/
├── rhizo_core/ # Rust core library
│ └── src/
│ ├── chunk_store/ # Content-addressable storage
│ ├── catalog/ # Versioned catalog
│ ├── branch/ # Git-like branching
│ ├── transaction/ # Cross-table ACID
│ ├── changelog/ # Change tracking
│ └── merkle/ # Merkle tree deduplication
│
├── rhizo_python/ # PyO3 bindings
├── python/rhizo/ # Python query layer
├── tests/ # Test suites
└── examples/ # Interactive demos
Design Principles
- Immutability — All data is immutable once written. Updates create new versions.
- Content Addressing — Data identified by BLAKE3 hash enables automatic deduplication.
- Atomic Operations — Write-to-temp-rename pattern prevents corruption.
- Layered Architecture — ChunkStore, FileCatalog, and BranchManager are independent and composable.
- Time Travel by Default — Every version is preserved and queryable.
- Zero-Copy Branching — Branches are pointers to table versions, not data copies.
Documentation
- Technical Foundations — Mathematical proofs and complexity analysis
- Roadmap — Current status and what's next
- Changelog — Version history
- Origin Story — Why I built Rhizo
- Contributing — How to contribute
License
MIT — See LICENSE for details.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rhizo-0.1.3.tar.gz.
File metadata
- Download URL: rhizo-0.1.3.tar.gz
- Upload date:
- Size: 51.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c28e11d20aa6678a15343e8981cae829f90be37df588902ce5c8765c1d0cb1d
|
|
| MD5 |
e78de0c1149f92ed3c1c02326f372cc6
|
|
| BLAKE2b-256 |
6bec4eb4043e8398e14a9473b4891276f2b0a80623004748e31c8ad0e6c48d8c
|
Provenance
The following attestation bundles were made for rhizo-0.1.3.tar.gz:
Publisher:
publish.yml on rhizodata/rhizo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rhizo-0.1.3.tar.gz -
Subject digest:
6c28e11d20aa6678a15343e8981cae829f90be37df588902ce5c8765c1d0cb1d - Sigstore transparency entry: 835818444
- Sigstore integration time:
-
Permalink:
rhizodata/rhizo@f57da42d06de9665dfd91db5836e9e173ea9c431 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/rhizodata
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f57da42d06de9665dfd91db5836e9e173ea9c431 -
Trigger Event:
release
-
Statement type:
File details
Details for the file rhizo-0.1.3-py3-none-any.whl.
File metadata
- Download URL: rhizo-0.1.3-py3-none-any.whl
- Upload date:
- Size: 49.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c143520e23acbb4e44905cbe7860da0e15f8b61f2c80a8f932700eb99c1dad7
|
|
| MD5 |
3682a13467db0b49f2f76261b585c9ba
|
|
| BLAKE2b-256 |
82885c5fc13c6bd3f7df166387a0fe1fb00629748d7d17a3c3800140b3333b23
|
Provenance
The following attestation bundles were made for rhizo-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on rhizodata/rhizo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rhizo-0.1.3-py3-none-any.whl -
Subject digest:
6c143520e23acbb4e44905cbe7860da0e15f8b61f2c80a8f932700eb99c1dad7 - Sigstore transparency entry: 835818445
- Sigstore integration time:
-
Permalink:
rhizodata/rhizo@f57da42d06de9665dfd91db5836e9e173ea9c431 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/rhizodata
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f57da42d06de9665dfd91db5836e9e173ea9c431 -
Trigger Event:
release
-
Statement type: