Skip to content

0.6.0 – 2026-10-17

Choose a tag to compare

@github-actions github-actions released this 17 Oct 21:18

Release Notes

Added

  • Writes from JavaScript. TableWriter in @timelake/client appends to tables from Cloudflare Workers, Node,
    Deno, Bun, or browsers, through a Store (r2Store for an R2 binding, memoryStore, or your own). The
    WebAssembly module runs the engine's write path: the same row preparation, Parquet files, commits with retries, last-value
    index and head. Rows are objects or an Arrow IPC stream; batchId makes retries safe. Appends run inline
    maintenance like the engine's (size-tier and cold-partition compaction by streaming merge, within maxCompactBytes,
    default 64 MiB; retention; snapshot expiry), and writer.maintain() runs a full pass. Tables are created with
    the CLI or Python (SPEC §21.10). In Cloudflare Workers, import from @timelake/client/workers and pass the
    module from @timelake/client/timelake.wasm to initWasm. Measured in workerd: an append of 100,000 rows takes
    0.7 s and 37 MiB, compaction of a day of 24 files 2.7 s and 95 MiB (bench/results/WORKERS.md).
  • data-page-rows: rows per Parquet data page in the files a table gets (default 20,000; 8,192 for files
    written from JavaScript, where compaction holds a page per column of each file it merges).
  • Version check interval. The setting version-check-interval (table or session) says how long the Timelake
    reader uses a table version it loaded or checked before checking for a newer one. Within it, queries send no
    request for the table's version, and can miss commits by other processes; the process's own commits are seen at
    once, and writers always check. The default, 1 second, is the old fixed behaviour; 0s checks on every query
    (SET timelake.version_check_interval = '30s', --set, Lake(settings=…), or timelake alter --set).
  • Ingestion guides. The Quick start has eight sub-pages that set up
    continuous ingestion, each with several designs, a recommendation, scheduled checks on recent data, and
    maintenance: Local, AWS (S3, Kinesis, SQS, IoT Core, and Firehose into Lambda), Azure (Blob Storage, Event Hubs,
    Service Bus, and IoT Hub into Azure Functions), Google Cloud (Cloud Storage and Pub/Sub into Cloud Run functions),
    Cloudflare (R2 and Queues, appended by a consumer Worker with TableWriter or by a writer script), Fly.io, Vercel,
    and Tigris. Each platform has an
    overview, a setup page, a page per design, and a checks page; the docs sidebar opens and closes nested pages. The
    Quick start compares the platforms and designs. The AWS page compares S3 with S3 Tables.

Changed

  • Compaction streams. Compaction merges its input files as sorted streams instead of loading a partition into
    memory, so its memory no longer grows with the partition. Full compaction of TSBS IoT (72 hourly files into 3 days):
    3.65 → 2.37 s, peak memory 1.95 → 0.53 GB, with identical files.
  • Columns are encoded in parallel. Timelake writes Parquet with its own writer (shared with the WebAssembly
    writer), encoding each row group's columns on threads of their own. The files are the same, byte for byte. The
    compaction above takes 1.17 s instead of 2.37 s; importing 11.7M rows 4.7 s instead of 6.0 s.

Fixed

  • Docs: the storage page's check for conditional writes created a table twice, which fails the second time on any
    store. It now sends a put-if-absent twice with the AWS CLI. The quick start no longer says that Timelake reads AWS
    profiles: it reads the AWS_* environment variables (aws configure export-credentials exports a profile's). The
    storage page says to create a Tigris lake bucket as single-region or multi-region: on Tigris's default global
    buckets, conditional writes are checked within one region only.
  • @timelake/client didn't run in Cloudflare Workers: Workers can't compile WebAssembly from bytes at runtime,
    which the client did on first use. The @timelake/client/workers entry takes the compiled module instead.

Install timelake-cli 0.6.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/polythings/timelake/releases/download/v0.6.0/timelake-cli-installer.sh | sh

Install prebuilt binaries via powershell script

powershell -ExecutionPolicy Bypass -c "irm https://github.com/polythings/timelake/releases/download/v0.6.0/timelake-cli-installer.ps1 | iex"

Download timelake-cli 0.6.0

File Platform Checksum
timelake-cli-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
timelake-cli-x86_64-apple-darwin.tar.xz Intel macOS checksum
timelake-cli-x86_64-pc-windows-msvc.zip x64 Windows checksum
timelake-cli-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
timelake-cli-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum

Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo polythings/timelake

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> --repo polythings/timelake