A Git remote helper for storing repositories on
Tapedrive. Put git-remote-tape on your PATH and Git
learns the tape:// transport, alongside https:// and ssh://.
$ git clone tape://<tape-address>
$ git pull
$ git pushEvery byte received by Git is verified against an on-chain commitment, including bytes served through a gateway. Cloning needs no wallet, account, or permission; only the holder of the tape's key can push.
Note
Tapedrive is in early access and invite-only.
Sign up for access, join the Discord to follow development, or read the docs for the full picture. Anyone can clone an existing public repository; creating a tape and pushing to it requires access.
Tapedrive stores writes by content: a track's key is derived from its payload. Git works the same way, with content-addressed objects, so a Git remote mostly connects two compatible storage models.
| Git data | Tapedrive storage | Role |
|---|---|---|
| Packfiles | Content-addressed writes | Immutable repository objects, deduplicated by content |
Branches, tags, and HEAD |
One versioned write | The mutable view of the repository |
The helper speaks Git's native fetch and push protocol. It moves packfiles
and refs without re-synthesizing commits, so commit hashes, authorship, merge
topology, tags, signatures, file modes, symlinks, and submodules are preserved.
Install the remote helper from crates.io:
$ cargo install tape-git-remoteThis installs the git-remote-tape binary. Git discovers it automatically when
it encounters a tape:// URL.
Install the Tapedrive CLI, then reserve a tape for the repository:
$ tape -u d create --capacity 100m --epochs 250
tape address: <tape-address>The CLI saves the tape key under ~/.tape/cassettes/<tape-address>.json, where
the remote helper looks for it by default.
Add the tape as a remote and push:
$ cd my-repository
$ git remote add tape tape://<tape-address>
$ git push tape --all
$ git push tape --tagsAnyone with the address and the remote helper can now clone it:
$ git clone tape://<tape-address>
$ git ls-remote tape://<tape-address>From then on, branches and tags work through ordinary Git commands.
The repository's ref index is verified against its on-chain commitment. Each packfile is then checked against the digest in that verified index before being passed to Git.
When TAPE_GATEWAY_URL is configured, the helper tries the gateway first for
faster bulk reads. Gateway bytes receive the same verification. Invalid, stale,
or unavailable data is discarded and fetched directly from storage nodes, so a
gateway changes performance rather than the trust model.
Reads are public and require no keys. A push requires both a transaction fee payer and the key controlling the destination tape.
Warning
Repositories are public and storage is append-only. Deleting a ref or force-pushing does not remove previously stored objects. Never push a secret that may need to be withdrawn later.
| Variable | Default | Purpose |
|---|---|---|
TAPE_RPC_URL |
https://api.devnet.solana.com |
Solana RPC endpoint |
TAPE_GATEWAY_URL |
Direct storage-node reads | Optional gateway for bulk reads |
TAPE_KEYPAIR |
~/.config/solana/id.json, when present |
Transaction fee payer for pushes |
TAPE_CASSETTE |
~/.tape/cassettes/<tape-address>.json |
Key controlling the tape |
When the push credentials are absent, the helper remains read-only and cloning still works. An explicitly configured but invalid keypair path is treated as an error.
- Tapes reserve a fixed capacity for a fixed period. Use
tape resizeandtape extendto manage the reservation. - Repositories are public. Private repositories would require client-side encryption and are not currently supported.
- The first clone fetches the complete history. Later fetches download only packs the local repository has not already installed.
- There is no remote garbage collection. Packs accumulate as the repository is pushed.
- Concurrent pushes are resolved optimistically. The helper retries a raced update, but sustained contention can require the user to retry the push.
- This is a Git transport, not a forge: it does not provide a code browser, issues, pull requests, or collaboration workflows.
The crate's index module describes how a repository is laid out on a tape:
the name and content type of the ref index, its JSON encoding, and the digest
recorded for each pack. Tooling that publishes a repository through the SDK
directly, or lists a published repository's refs without invoking Git, should
build on those types so it stays in agreement with the helper. See the
API reference for details.
$ make checkLicensed under the Apache License, Version 2.0. See LICENSE for details.