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 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 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.
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.
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.