N Nightship
Guides / Storage
// storage

Storage engines: Cargo vs Tide

Nightship is built around one model: your builds live in storage you own, our uploader pushes them there, and nightshipd only coordinates. That is Tide. Cargo is an equally supported, self-contained alternative that needs no bucket.

The model: bring your own storage, our uploader, nightshipd coordinates.

Build bytes live in an S3-compatible bucket you own; nightship-tide uploads builds straight into it; and nightshipd never stores or proxies a byte — it only points channels at builds and authorizes reads. That is Tide. Cargo is the exception: a self-contained alternative where the server holds whole files itself. Both engines are first-class.

Tide (the model)

Tide is the delta engine and the way Nightship is designed to distribute builds. A build is split into content-defined chunks (a rolling-hash boundary, so inserting bytes doesn’t shift everything), each chunk is hashed with BLAKE3 to become its own address, and only the chunks that actually changed are transferred. The chunks live in your own S3-compatible bucket, uploaded by nightship-tide; nightshipd stays out of the byte path entirely and only authorizes reads. That split is what lets one small server distribute very large builds to many people — and it keeps the build data on infrastructure you own.

Tide shines on large, frequently-rebuilt trees — game builds in particular, where a tiny change repacks a giant .pak or .assets archive but content-defined chunking still deltas it well. See The Tide delta engine, in depth.

Cargo (self-contained, no bucket)

Cargo is the original, self-contained engine. The server stores complete build files itself, in its data directory — no bucket, no uploader, no extra credentials. It’s the easy choice for smaller or less-frequently updated builds, or when you just want a server that works with no external storage. It is the one case where nightshipd holds the build bytes.

Screenshot — the Subscriptions list showing the Δ Tide and crate Cargo markers, with the inspector
The client marks each channel’s engine.

How the engine is chosen

Engine is a per-channel choice, set when the channel is created, and locked once builds exist (changing it would void the delta history). Create a Tide channel in the app (Admin → Channels → Create → Tide) or implicitly when CI pushes with --register (see Push a build); a channel created with no engine specified defaults to Cargo. The client detects each channel’s engine automatically and marks it: a small Δ for Tide, a crate for Cargo.

Which to use

Use Tide for real build distribution — large or fast-changing builds, testers who should pull only the delta, and build data that stays in storage you own (R2, S3, or a self-hosted store). Reach for Cargo when you want zero extra infrastructure and your builds are modest. They coexist: one server can serve some channels with Cargo and others with Tide. To wire Tide up, see Connect object storage for Tide.

← All guides