Timelaketimelake
DocsBenchmarksRoadmapSpecContribute
Apache 2.0 ·
Roadmap

DoneIn progressPlanned

Tables and storage

Done:1. Iceberg tablesDone:2. CommitsDone:3. Object-store catalogIn progress:4. Time-series table contractIn progress:5. File layout and encodingsIn progress:6. Last-value indexDone:7. One-request table state and version checksDone:8. Table format versions and upgradesDone:9. SettingsPlanned:10. Supplemental timestamps

Writing

Done:11. AppendsDone:12. Late data and dedup on readDone:13. Writes from WebAssemblyPlanned:14. Hot tier and seconds-fresh readsPlanned:15. BackfillIn progress:16. Import and migrationPlanned:17. DeletesPlanned:18. GDPR erasure

Maintenance

Done:19. CompactionIn progress:20. Maintenance runs, retention and expiry

Reading

In progress:21. Timelake readerDone:22. Block cacheDone:23. Filter pushdownDone:24. Pruning with long IN listsDone:25. Newest-first scansDone:26. Scans in series orderDone:27. Materialized rollups

SQL functions

In progress:28. Function libraryDone:29. Time buckets and gap fillingDone:30. Signal aggregatesDone:31. Downsampling with m4

Integrations

Planned:32. REST catalogPlanned:33. DuckDB extensionPlanned:34. Snowflake connectionPlanned:35. Multitenancy

Services

Planned:36. Ingestion and rulesPlanned:37. Data to eventsPlanned:38. Static read modelsPlanned:39. Computed metricsPlanned:40. Agent access with permission setsPlanned:41. Device syncPlanned:42. Edge gatewayPlanned:43. Server mode

Benchmarks

In progress:44. Benchmark harness: timebenchIn progress:45. Industrial IoT benchmarkPlanned:46. Agent benchmark

Background

ArchitectureDeployment and cost modelEmbedded engine: DataFusionLandscape and positioningLicense and open corePurpose and requirementsReleases
TimelaketimelakeThe open time-series lakehouse.
v0 · Apache 2.0 · Contribute · GitHubBuilt on Apache Arrow, Apache DataFusion, Apache Parquet, and Apache Iceberg.
DocsBenchmarksRoadmapSpecContribute

Background

Architecture

Summary

How the pieces fit: Parquet on object storage, Iceberg tables, Arrow in memory, DataFusion embedded as the engine. The components (core library, catalog, functions, reader, ingest, maintenance, CLI, Python, DuckDB extension) and which of them run where. No component is a mandatory always-on server.

Design

LayerTechnologyRole in Timelake
Object storageS3, GCS, Azure Blob, MinIO, R2, local diskHolds all data and metadata files. Accessed via the Rust object_store crate.
File formatApache Parquet (later Vortex)Columnar on-disk format. Compressed, with per-column statistics (min/max/null counts) and page indexes that let readers skip data.
Table formatApache IcebergTurns a pile of Parquet files into a table: schema, partitioning, snapshots (time travel), atomic commits, and file-level statistics in manifests. This is what makes DuckDB/Spark/Trino able to read our data.
Catalogtimelake-catalog (ours, spec 32; built so far: the object-store catalog, spec 3) or any Iceberg REST catalog (Lakekeeper, Polaris, Glue, S3 Tables, Nessie, …)Maps table names to the current metadata file and makes commits atomic. Every commit and every reader goes through it.
In-memory formatApache ArrowColumnar in-memory format and the lingua franca between systems. Rust, Python (PyArrow/Polars/pandas), and DuckDB can exchange Arrow data zero-copy. We use Arrow for every in-flight batch: ingestion buffers, WAL segments (Arrow IPC), query results, and the Python API.
Query engine (embedded)Apache DataFusionRust library containing a SQL parser, planner, optimizer, and vectorized executor that operates on Arrow. It is not a server; we embed it. We extend it with custom table providers (our pruning + hot-tier merge), UDFs/UDAFs (time-series functions), and optimizer rules (route queries to rollups). It powers compaction, rollup refresh, in-stream rules, and the Timelake reader.
Iceberg in Rusticeberg-rust (Apache)Rust implementation of the Iceberg spec, including catalog clients and a DataFusion integration. Our base for reading and writing Iceberg metadata.
External enginesDuckDB, Spark, Trino, Snowflake, AthenaRead our Iceberg tables directly. DuckDB is the first-class "plain SQL" path (R1, R10).

In short, Parquet is how data sits on disk, Iceberg is how files become tables, Arrow is how data moves in memory, and DataFusion is the engine we embed to compute on it.

Architecture overview

  Devices / MQTT /     ┌───────────────────────────────────────────────┐
  Kafka / HTTP /  ───► │ timelake-ingest (stateless)                   │
  Arrow Flight         │ decode → validate → transform → rules/alarms  │
                       │ → buffer → WAL append → lake commit           │
                       └──────┬────────────────┬────────────────┬──────┘
                              │ events/alarms  │ recent data    │ Parquet + commit
                              ▼                ▼                ▼
                      sinks (webhook,    ┌───────────┐   ┌──────────────────────┐    ┌─────────────────────┐
                      Kafka, SNS) +      │ Hot tier  │   │ Iceberg tables on    │◄───┤ timelake backfill   │
                      events table       │ (optional)│   │ object storage       │    │ branch → publish    │
                                         │ S3 WAL /  │   │ raw / rollups /      │    │ ◄ files, DBs,       │
                                         │ Valkey /  │   │ events / metadata    │    │   Iceberg tables    │
                                         │ DuckDB/PG │   └──────────▲───────────┘    └─────────────────────┘
                                         └─────▲─────┘              │
                                               │         ┌──────────┴───────────────┐
                                               │         │ timelake-maintain (jobs) │
                                               │         │ compaction, rollups,     │
                                               │         │ retention, erasure, idx  │
                                               │         └──────────────────────────┘
         ┌─────────────────────────────────────┴─────────────────────────────────────┐
         │ Readers                                                                   │
         │  • timelake reader (Rust/Python): lake + hot-tier merge, Puffin index     │
         │    pruning, rollup routing, TS functions                                  │
         │  • DuckDB + timelake extension: the same, inside DuckDB                   │
         │  • Plain DuckDB / Spark / Trino: committed Iceberg data                   │
         └───────────────────────────────────────────────────────────────────────────┘

Not drawn: the catalog (timelake-catalog or third-party). Every commit and every reader's table lookup goes through it.

Components (all Rust)

ComponentFormResponsibility
timelake-corelibraryTable conventions, writer (sorting, partitioning, file sizing), commit protocol, Puffin indexes, hot-tier trait
timelake-cataloglibrary + optional serviceIceberg REST catalog with commit queueing, metadata cache, scan planning, commit events (spec 32)
timelake-functionslibraryEngine-agnostic time-series kernels on Arrow (embedded engine)
timelake-querylibraryDataFusion integration: table provider, UDF adapters, rollup query rewrite, hot-tier merge, fast paths
timelake-ingestbinary / containerFirehose-style ingestion with in-stream rules (spec 36)
timelake-maintainbinary / jobCompaction, rollup refresh, retention, snapshot expiry. Runs as cron, k8s CronJob, Lambda, or on commit events
timelake CLIbinaryCreate/adopt tables, backfill, query, inspect, erase, run maintenance
timelake PythonPyO3 wheelQuery → Arrow / Polars / pandas; write; rollup management
DuckDB extensionloadable extensionPrimary user-facing SQL path: Timelake-aware scans (indexes, hot tier, dedup) and the function library in DuckDB

Decisions

IDDecisionStatus
D4Any database-backed component (hot store, catalog DB) is an optional performance upgrade, never a requirementAccepted
D14Rust for the core, even where we must implement Iceberg operations ourselves. Python is the client/API layer (PyO3), not the engine.Accepted

Open questions and issues

None open.

History

  • 2026-10-11: primer and architecture overview (SPEC.md §4, §6)
  • 2026-10-19: moved from SPEC.md into its own spec.
  • 2026-10-19: was spec 2; a background page since the specs were regrouped one per feature.