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 1 · Tables and storage

Iceberg tables

DoneUpdated 2026-10-13View on GitHub
Versions
0.1.0
Roadmap
v0: a maintenance-free time-series table on S3
Related
2. Commits, 3. Object-store catalog, 4. Time-series table contract, 21. Timelake reader

Summary

Every Timelake table is a plain Apache Iceberg table of Parquet files, so DuckDB, Spark, Trino, Snowflake and Athena read it with no Timelake software. Timelake adds its time-series conventions only through Iceberg's extension points (table properties, snapshot summaries, sidecar files), which other engines ignore.

Design

Iceberg is the source of truth. We add "Timelake conventions" on top using only Iceberg's extension points.

Iceberg already provides the mechanisms we need to add time-series intelligence without breaking other readers:

Extension pointWhat we store thereOther engines
Table properties (timelake.*)Table kind (raw / rollup / events), time column, series key, dedup policy, retention, rollup definitionsIgnore
Snapshot summary propertiesIngest watermarks (WAL offsets), changed time ranges per commit, idempotency/batch IDsIgnore
Puffin statistics filesSeries→file index, per-series time ranges, "last value" index, sketchesIgnore unknown blobs (to verify per engine)
Sort order + partition spec(series_key…, time_column) sort; time + bucket partitioningUse for pruning
Sidecar Iceberg tablesSeries/device metadata, rollups, events/alarmsFully readable

Plain DuckDB (zero Timelake software). Any Iceberg engine reads committed data:

INSTALL iceberg; LOAD iceberg;
ATTACH 'warehouse' AS lake (TYPE iceberg, ENDPOINT 'https://catalog…');
SELECT time_bucket(INTERVAL '1 hour', bucket) AS h, avg(avg_value)
FROM lake.iot.sensor_1m WHERE device_id = 'pump-7' AND bucket > now() - INTERVAL 7 DAY
GROUP BY 1 ORDER BY 1;

This path sees committed data only, and does not get hot-tier merge, dedup on read or the full function library: those come with the Timelake reader (spec 21) or the DuckDB extension (spec 33). v0 checked that plain DuckDB reads every Timelake table with identical results (the milestone "v0").

Why not a custom format (yet)

  • Ecosystem: Iceberg is readable by DuckDB, Spark, Trino, Flink, Snowflake, BigQuery, Athena, and Databricks. A custom format would forfeit R1 (purpose and requirements).
  • The known Iceberg weaknesses for time series are commit overhead (each commit writes metadata.json + a manifest list + manifests) and commit throughput (optimistic concurrency at the catalog). Both are addressable around Iceberg:
    • Batch commits: a single committer per table, committing every N seconds or N MB.
    • A hot tier for sub-commit freshness (spec 14).
    • Aggressive manifest compaction and snapshot expiration.
    • Adopting Iceberg v4 improvements (proposed single-file commits / adaptive metadata tree) when they land.
  • DuckLake chose a SQL database as its catalog largely to solve small commits and fast metadata. Our hot tier plays the same role optionally, and keeps the lake itself pure Iceberg.

When we would revisit

We revisit if benchmarks show that Iceberg metadata planning dominates latency for typical queries even after Puffin indexes and metadata caching. Even then, the fallback is a Timelake index layer that accelerates Iceberg, not a replacement for it. The table head (spec 7) is such a layer.

Decisions

IDDecisionStatus
D1Build on Apache Iceberg; no custom table formatAccepted

Open questions and issues

  • #104 Question: Iceberg v2 or v3 as the minimum table version
  • #134 Plain DuckDB reads Timelake files on S3 slower than PyArrow-written files (0.52 vs 0.42 s)

History

  • 2026-10-11: format choice and extension points (SPEC.md §5)
  • 2026-10-19: moved from SPEC.md into spec 3, then into this spec when the specs were regrouped one per feature (with the plain DuckDB path from spec 17).