Bootstrap

Bootstrap is the new-client initialization endpoint. A single request returns:

  1. The latest snapshot (if any)
  2. The updates after the snapshot (one part per record on a JSON stream, one part in all on any other stream), up to the stream's current tail or up to an honest stopping point
GET /{bucket}/{stream}/bootstrap

The response is multipart/mixed:

  • First part. The snapshot. If no snapshot exists, this part is present but empty.
  • Subsequent parts. Incremental updates from the snapshot offset (or from the earliest retained offset, if no snapshot exists).

Each part has its own Content-Type: the snapshot part uses snapshot_content_type. Update parts use the stream's content type. The client does not need to know in advance whether a snapshot exists. The same parsing path handles both cases.

Partial responses

Bootstrap only serves updates that are still in the hot tier, and at most 8 MiB of them per response. When updates after the snapshot have already moved to cold storage, or there are more than 8 MiB of them, the response stops early: Stream-Next-Offset is where it stopped and Stream-Up-To-Date is absent. In the cold case, and for a non-JSON stream above 8 MiB, the response holds only the snapshot part; a JSON stream above 8 MiB stops at a record boundary. It never skips bytes.

Clients therefore follow one rule: after applying the bootstrap response, read from Stream-Next-Offset with ordinary reads until Stream-Up-To-Date: true, then go live. A complete response simply makes that loop empty.

When to use bootstrap vs catch-up

You want…Use
Latest state, fastest first-load/bootstrap
Replay every byte from the beginningGET /{b}/{s}?offset=-1
Resume from a known offset that's still retainedGET /{b}/{s}?offset=N
Resume from an offset the server has since trimmed (410 Gone)/bootstrap, then continue from its Stream-Next-Offset

Live continuation

Bootstrap does not accept ?live=sse. Combining the multipart body with an SSE event stream is rejected with 400. To go live after bootstrap, finish reading the bootstrap response, then open a separate GET /{b}/{s}?offset=<Stream-Next-Offset>&live=sse. SSE delivers any remaining catch-up data first, so this also covers a partial response.