1. Read with plain HTTP
Every track is fetchable by address from any gateway, with no SDK and no signing. Track-addressed URLs never change payloads, so they cache indefinitely (direct URLs).2. Write and read back with the SDK
The one-call path: a named write dispatched by size, then retrieval by name. Client setup (keypair and gateway endpoint) is in the quickstart.waitFor is for the first read only, covering the moment between the write landing and the gateway serving the fresh track. Once it has been served, consecutive reads return immediately.
The snippet writes 12 bytes, which lands inline and is certified on the spot. Anything bigger dispatches to the coded path, where certification is what finishes the write: a quorum of the track’s spool group signs that it holds your slices, and gateways serve the track only once that lands (until then, reads answer 400). The SDK runs that finish inside every one-call write (certify).
3. Write from a bare Solana transaction
For integrators who want to append data without pulling in the Tapedrive library. The inline write is one instruction whose payload rides the transaction itself, and inline tracks are certified the moment they land, so a single transaction is a complete, finished write. Coded writes are different: they land registered but unserved until a quorum of the spool group certifies them, and nodes eventually reclaim tracks that never certify. Slice distribution and that certification finish are what the SDK write engine does, so above the inline budget, use the SDK. The instruction below is byte-checked against both the on-chain parser and the SDK’s own builders; the file compiles as-is againstsolana-sdk, and simulating it against the
program deployed on devnet routes it to the TrackWrite handler.
The wire format
Instruction data, all integers little-endian:
Naming the track makes it an object and appends a 12-byte trailer plus the name (skip all of it for a nameless track):
Five accounts, in this order:
No track account appears: the track is appended into the tape account’s Merkle tree, and its number is assigned on-chain (the tape’s next track number), not passed in.
The 825-byte figure is the packet budget for a wallet transaction, not the format’s ceiling: CPI instruction data can carry the full 10 KiB, so another program can stage a payload in an account across transactions and land it with a single CPI write.
The builder, one file
Depends only onsolana-sdk. The program ID matches the SDK’s generated constants; the networks page lists per-environment addresses.
tape_write_ix.rs
Sending it
TrackWritten event carrying the number and the derived track address; track_pda(tape, number) reproduces the address for read-back through example 1, and a named write also resolves by name through any listing.
The program enforces the rest: the tape must exist, be inside its activation and expiry epochs, and have capacity for the payload; the signer must be the tape’s authority or its configured delegate; a named write’s name must be 1 to 1024 bytes. Reservation itself is one SDK or CLI call (quickstart).
4. Git with a tape as the remote
git push and git clone work against a tape through git-remote-tape, a standard Git
remote helper. Once it is on your PATH, Git learns the tape:// transport. Each push
writes one packfile as a content-addressed track, and the refs live in one named object
that each push rewrites. Every byte a clone receives is checked against the on-chain
commitment before Git sees it.
Install it
git-remote-tape helper. See
the installation page for supported platforms.
Use it
For Tapenet, complete the wallet and funding setup first. Reserve a tape to push to. The helper finds its keypair under~/.tape/cassettes/, which is where tape create puts it.
TAPE_GATEWAY_URL to read through a gateway, which is several times faster than reading from storage nodes directly and is the only path from a network that lets only port 443 out. The helper verifies what the gateway returns before handing it to git.
A push is two chain writes, so it cannot take less than about 7 s. The public RPC rate-limits a push and asks for a ten second wait, which is where the extra time goes.
Two things to know before trusting it with anything that matters. Nothing can be unpushed, because storage is append only, so a secret you push cannot be taken back. And every repository is public: reads are open to anyone with the address, so a private repository here has to mean an encrypted one, which the helper does not do yet.