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 20 · Maintenance

Maintenance runs, retention and expiry

In progressUpdated 2026-10-20View on GitHub
Versions
0.1.0, 0.3.0, 0.5.0, unreleased
Roadmap
v0: a maintenance-free time-series table on S3, Tuned on real data, Technical preview
Related
13. Writes from WebAssembly, 19. Compaction, 27. Materialized rollups

Summary

The jobs Timelake replaces Glue with (compaction, rollup refresh, retention, snapshot expiry and file cleanup) run inline after appends when thresholds are met, or as one stateless timelake maintain command. Nothing outside Timelake has to be scheduled. Orphan-file cleanup and sharded runs are open.

Design

timelake-maintain runs as a set of idempotent, independently schedulable tasks:

TaskWhat it doesStatus
Compactionspec 19Built
Rollup refreshIncremental, from the raw table's changed buckets (spec 27)Built (0.5.0)
RetentionPer-table TTL (e.g. raw 90 d, 1-min rollup 2 y, 1-h rollup forever). Drops whole partitions (metadata-only when aligned)Built
Snapshot expiryExpires old snapshots and deletes the files only they reference, never one a branch or tag points at; timelake.keep-snapshots-until keeps them longer (0.3.0, for upgrades). What the kept snapshots use is read in full first: if a manifest list or manifest of one is missing, expiry stops with an error naming it and deletes nothing; one only expired snapshots used that is already gone is skippedBuilt
Orphan cleanupDeletes files no snapshot references (#50)Planned
Manifest rewriteClusters manifests by time so planning stays fast as tables growPlanned
  • Inline: after an append, auto-maintain runs the tasks whose thresholds are met (compact-min-files, compact-cold-after, rollup-refresh-interval, …), so small deployments need nothing else.
  • timelake maintain (Table.maintain()) runs a full pass: every partition rewritten into one file, every rollup refreshed (--no-rollups to skip), retention and expiry. Stateless: a cron job, a Kubernetes CronJob, a Lambda, or triggered by commit events (catalog events, S3 notifications).
  • Concurrency: safe through Iceberg optimistic commits and conflict-aware retries (spec 2).
  • Limits per run: a setting caps the bytes one run rewrites (needed on Workers, where a request has at most 5 minutes of CPU; useful anywhere inline maintenance shouldn't hold up appends). A run that stops at the cap commits what it rewrote; the next run continues. Built in the shared (WASM) maintenance (spec 13), and MaintainOptions::max_bytes in the engine (unreleased).
  • One plan for both writers: which files compaction merges, which partitions retention drops, which snapshots expire and which metadata files go are decided by timelake_format::maintain for the engine and the WASM writer alike, and both report the same fields. Only the engine refreshes rollups.

Open questions and issues

  • #13 Maintenance: wait a minimum age before deleting files of expired snapshots
  • #18 Maintenance: --shard i/n so concurrent runs don't repeat work
  • #50 Maintenance: delete orphan files

History

  • 2026-10-11: maintenance tasks (SPEC.md §12)
  • 2026-10-12: inline maintenance, retention and expiry built in v0
  • 2026-10-14: keep-snapshots-until for upgrades
  • 2026-10-17: rollup refresh in maintenance; byte cap per run (WASM)
  • 2026-10-19: moved from SPEC.md into spec 15, then into this spec when the specs were regrouped one per feature.
  • 2026-10-20: expiry reads what the kept snapshots use in full before it changes anything (#46).
  • 2026-10-20: expiry keeps snapshots a branch or tag points at.
  • 2026-10-20: one plan and one report for both writers; the engine skips manifests an interrupted expiry deleted, as the WASM writer did, and lists only metadata/v to prune old metadata files. The WASM writer's expiry retries with backoff and a limit, as commits do.