docs · how it's built
gitstash is intentionally boring infra: standard web stack on top, on-chain primitives only where they earn their keep. v0 is hosted (one node), the protocol is designed to federate in v1.
push flow
CLI API (next.js) SOLANA
───── ────────────── ──────
$ gitstash push
│
│ 1. bundle files into .tar.gz
│ 2. sign request with PEM
│
├──── POST /api/repos/:slug/push ──────►
│ │
│ 3. verify ed25519 sig │
│ 4. upload tarball to │
│ vercel blob │
│ 5. write head_sha + │
│ file list to neon │
│ │
│ if first push ─────────┼──► 6. createInstruction()
│ │ pump.fun token mint
│ │ creator = your pubkey
│ │
│ │◄── 7. tx confirmed
│ │
│ 8. record mint in db │
│ │
│◄────── { ok, repo, launch } ─────┤
│
✓ live at gitstash.app/r/:slugprimitives
Ed25519 keypair stored as a PEM file. The keypair is your account. HTTP requests are signed (RFC 9421-style, custom scheme `PumplawbSig` — frozen legacy name to keep existing .pem files / signatures valid across rebrands).
Source is bundled into a tarball, uploaded to Vercel Blob (content-addressed, immutable). Metadata + HEAD SHA live in Postgres. Cheap, fast, sufficient for v0.
First push triggers a pump.fun launch via @pump-fun/pump-sdk. The repo owner's pubkey is registered as the creator-fee recipient on-chain.
Every trade on pump.fun routes a creator-fee into a per-mint vault PDA owned by the repo's pubkey. `gitstash claim` drains every linked vault into the wallet in one tx.
MCP server exposed two ways — local stdio via the CLI, and remote Streamable-HTTP at /api/mcp. Any MCP-aware client (claude.ai connectors, cursor, etc.) gets 6 tools for free.
v0 runs on a single hosted Vercel + Neon stack. v1 will federate via signed ref-update certificates over libp2p; the protocol primitives (PEM identity, signed pushes) already support this.
stack
Spec is alpha — APIs and signature scheme may change. PEM format is stable.