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

Spec 6 · Tables and storage

Last-value index

In progressUpdated 2026-10-19View on GitHub
Versions
0.1.0, 0.5.0, unreleased
Roadmap
v0: a maintenance-free time-series table on S3, Millions of series
Related
7. One-request table state and version checks, 12. Late data and dedup on read, 21. Timelake reader

Summary

The latest row of every series, kept in a small Parquet file per snapshot, so "the current state of every device" is answered in a few requests instead of a scan. Latest-row queries are rewritten onto it automatically. It works at hundreds of thousands of series; making its cost per commit independent of the series count is open.

Design

  • Storage: a Parquet sidecar per snapshot, referenced from the snapshot summary (timelake.last-value-index), not a Puffin blob: any engine can read it. The head carries it inline while it fits the inline budget (spec 7).
  • Maintenance: each append extends the previous index with the newest rows of its batch. Since 2026-10-19 the two sorted inputs are merged (k-way, keeping the latest of each series) instead of concatenated and sorted: a 100,000-row append to a table of 1,000,000 series 264 → 171 ms (bench/results/PERFORMANCE.md, P10). Among rows with the same series, the latest insertion time wins, then the later commit (spec 12).
  • Reads: the Timelake reader rewrites latest-row queries (ROW_NUMBER() … = 1, ORDER BY time DESC LIMIT 1 per series, timelake latest) onto the index. v0: 12 requests instead of 1,700–3,600 on S3; with the head, a cold latest takes one round trip.
  • Scale (measured 2026-10-18, the milestone "Millions of series"): 1.8 MB and 0.15 s of a 4.5 s commit at 400k series, 3.4 s at 10M in memory. After the merge, what remains (~80 ms at 1M series) is encoding the whole index, about 1.5 s a commit at 10M series. Options: index deltas per commit, merged by readers and folded into the base by maintenance (#119); or shards by series hash, which don't help a writer whose batches touch every shard.

Decisions

IDDecisionStatus
D18The last-value index is a per-snapshot Parquet sidecar referenced from the snapshot summary (timelake.last-value-index), not a Puffin blob: any engine can read it, and it is rewritten incrementally on each append (previous index ⊕ newest rows of the batch).Accepted

Open questions and issues

  • #19 Last-value index: drop series past retention so it stays bounded
  • #57 Query: answer "list the series" from the last-value index
  • #119 Last-value index: deltas per commit instead of rewriting the whole index
  • #120 Last-value index for mostly idle series

History

  • 2026-10-12: built in v0 (D18)
  • 2026-10-16: insertion time decides the latest row
  • 2026-10-19: extended by merging sorted indexes; moved from SPEC.md (spec 6, spec 26) into this spec when the specs were regrouped one per feature.