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 11 · Writing

Appends

DoneUpdated 2026-10-20View on GitHub
Versions
0.1.0, 0.5.0, 0.6.0, 0.7.0, unreleased
Roadmap
v0: a maintenance-free time-series table on S3, Writes from JavaScript, Tuned on real data, Technical preview
Related
2. Commits, 5. File layout and encodings, 12. Late data and dedup on read, 14. Hot tier and seconds-fresh reads, 15. Backfill, 19. Compaction

Summary

An append takes Arrow batches, aligns them to the table's schema, sorts them by (partition, series…, time), keeps the last of equal keys, writes Parquet in the table's layout and commits it, then runs inline maintenance. Writers batch rows and commit every few seconds or megabytes; batch IDs make retries safe.

Design

Ingestion modes

  • Continuous: Records stream into timelake-ingest (spec 36) or the Rust/Python writer. They are buffered and committed to Iceberg every T seconds or S MB (defaults: 60 s / 128 MB).
  • Batch / backfill: Bulk loads of historical data go through the backfill path (spec 15).
  • Idempotency: Each batch carries an ID that is recorded in the snapshot summary, so retried commits are no-ops (spec 2).
  • Seconds-fresh reads before a commit need the hot tier (spec 14).

The write path

  1. Align the batches to the table's schema; fill _ingest_ts with the time the append started unless the input brings its own values (spec 12). Types are converted only where no value is lost: a value that doesn't fit (out of range, unparsable, inexact) is an error naming the column, never a null.
  2. Sort by (partition, series…, time, insertion time) and split by time partition. With dedup on, only the last of equal (series, time) keys is kept, so every file is free of duplicates on its own (0.5.0). Appends past 1 GiB sort groups of up to 1 GiB and merge them, so a string column of more than 2 GiB no longer overflows (0.7.0).
  3. Write Parquet in the table's layout (spec 5), columns encoded in parallel (0.6.0).
  4. Commit in two steps (spec 2), with the extended last-value index (spec 6) and head (spec 7).
  5. Maintain inline when thresholds are met (spec 20).

The same path runs in WebAssembly for JavaScript writers (spec 13).

Recommended: one writer per table batching rows into appends of a few thousand rows or more. Concurrent writers are safe (optimistic commits), but each conflict costs a retry, and many tiny appends make many tiny files.

Open questions and issues

  • #54 Ingest: backpressure and limits
  • #67 Ingest: measure arrival delay and derive how long a slot stays open

History

  • 2026-10-11: ingestion modes (SPEC.md §8)
  • 2026-10-12: built in v0
  • 2026-10-17: dedup within an append; columns encoded in parallel
  • 2026-10-18: appends past 1 GiB sorted in groups and merged
  • 2026-10-19: moved from SPEC.md into spec 9, then into this spec when the specs were regrouped one per feature.
  • 2026-10-20: lossy type conversions on append are errors (#22), a timestamp to a coarser unit too