← kygit.com

Handoff. Resume.

Two verbs. One agent hands off — dirty tree included — with a note. A different agent, on a different machine, model, account, or vendor, resumes exactly and keeps going.

Just because your agents are ephemeral doesn't mean their work has to be.
The agent is temporary. The vault is permanent.

Today an agent's work usually dies with its sandbox unless a human ferries it — copies a diff into a chat, zips a directory, walks someone through what changed. run402 repos handoff replaces the ferrying: it captures your exact repository state — staged, unstaged, deleted, and untracked changes, all distinct — mints a single-use key, and you paste the key to the next agent. That agent runs run402 repos resume and gets the exact state back, note included, on a machine that has never seen this repository before.

one key, one use

The flow

  1. Agent A runs run402 repos handoff. The dirty tree — staged, unstaged, deleted, and untracked files, each distinct — is captured and encrypted on A's own machine; a Handoff Note (what happened, what remains, what to try next) is written alongside it. A single-use Handoff Key — kgh1_…, 69 characters — is assembled and printed exactly once. Nothing about the key ever reaches KyGit's servers.
  2. A pastes the key to Agent B — in a chat, a ticket, a message, however the two agents already talk. The key is the whole handoff; no shared directory, no invite email, no dashboard click is needed on either side.
  3. Agent B runs run402 repos resume kgh1_… (a brand-new machine with only npx -y run402 installed works). B becomes a member of A's org at A's own role (or narrower, if A minted it that way), the working tree is restored into a fresh directory exactly as A left it, and the note renders as Markdown. B reads what A did, runs the tests the note names, and continues — or pushes straight back to the same vault.
run402 repos handoff --json
→ kgh1_9f2a...   (printed once — copy it now)

KyGit resume kgh1_9f2a... --to ./work
→ restored: 2 modified, 1 staged, 1 untracked, 1 deleted
→ note: "Auth flow done; tests green except the OAuth callback redirect..."

What gets captured — and what never does

handoff captures dirty work by default (its sibling verb, snapshot, keeps refusing dirty work by default — two verbs, two defaults, on the same capture path underneath). Staged changes, unstaged changes, deleted files, and untracked files are all restored distinctly on the other end — resume tells them apart, it does not flatten them into one commit. Files your .gitignore already excludes are never transferred, exactly as with an ordinary push.

A fixed sensitive-file denylist is applied to the untracked set only (tracked files are the choice you already committed to git, so they travel as-is): .env and .env.*, *.pem, *.key, private-key files (id_rsa*, id_ed25519*), .npmrc, .netrc, .git-credentials, *.tfstate*, credential JSON, .aws/**, .ssh/**, and more. Anything excluded is named in the response — capture.sensitive_excluded[] — never silently dropped, never silently included. A path you deliberately want handed over anyway is re-admitted with --include-sensitive <glob>.

The note

The Handoff Note travels sealed alongside the checkpoint, readable by every key-holder forever: what happened, what's in progress, what's failing, what was tried and didn't work, the next steps, the exact commands to run (test / build / run), decisions made, and open questions. It is written truthfully — a harness that invents a passing test result to look finished defeats the entire point of a handoff. run402 repos resume renders it as Markdown by default; --json returns it raw. Before the checkpoint commit is even written, a client-side scan refuses the handoff if the note itself contains something that looks like a secret (a known key prefix, a `-----BEGIN` block, a high-entropy token) — a note is read by another agent, and secrets have the secrets API instead.

What you're handing over — read this before you paste the key

The blast-radius sentence

Whoever claims this key first becomes a <role> of this org and a writer of this vault, permanently. The key works once and expires at <expires_at>.

That is the exact sentence run402 repos handoff prints to your terminal — it is not paraphrased here, and the CLI does not soften it. A handoff mints an org membership, not a scoped read link: the recipient becomes a real member at your own role, or narrower if you asked for narrower (--role <role>), never wider. Paste the key only to whoever you mean to hand real authority to.

Free — and it stays that way

The free floor

1 GB of encrypted vaults, free forever, unlimited repos — never expires, never deleted for non-payment.

The free tier every fresh agent lands on is perpetual — it does not lapse on a clock the way a trial does. That matters specifically for a handoff: the whole point is that work can sit in the vault for however long it takes another agent to pick it up, and a vault that could expire out from under an unredeemed handoff would undercut the product. GitHub is the honest comparator on the floor itself — free, unlimited repos, never expires — and KyGit's free floor is held to the same bar. Where the two part ways is what the host can see: GitHub can read every repository it stores; KyGit cannot read yours. Private by construction, not by policy — the keys never leave your machines, and what reaches storage is ciphertext we cannot open.

If KyGit itself is ever unreachable

A handoff is a redeem against your own vault, and the vault's own exit ramp applies to it exactly as it applies to everything else in the vault: Your repository ciphertext moves directly between your machine and storage — our servers never handle it. With a mirror configured (run402 repos mirror s3://your-own-bucket, the recommended default rather than a power-user extra), Your ciphertext replicates to a bucket you own. We can't decrypt your repository history — and we can't hold it either. If we disappeared tomorrow, your repository is recoverable from a bucket listing and your keys, with an open-source tool. No server required. Provable, not promised. We proved it against production: a real vault, mirrored, then recovered ref-exact with the gateway deliberately unreachable. Every prune requires receipts from two independently built open-source implementations — one in TypeScript, one in Rust.

The durability sentence carries its honest qualifier, and a handoff is the best answer to it: The vault protects source history from host-side loss while a principal keystore survives. A vault starts with exactly one keystore that can open it — the client says so to your face — and a lone agent on one machine is a single point of failure for its own history. The moment B resumes, a second keystore on a second machine can open the vault: two agents who can each restore it are precisely the backup one agent never had. Human envelopes — a person's own key on the vault — are next; until they ship, keep a keystore backed up, and let a handoff be the second copy in the meantime.

For agents

There is no separate KyGit CLI, API, or protocol for this — one machine surface, one vocabulary: run402 repos handoff / run402 repos resume, or the same two verbs through the shim, run402 repos handoff / run402 repos resume. Your reference is run402.com/llms-full.txt (section “vault”, routes under POST /vaults/v1/:vault_id/handoffs and POST /vaults/v1/handoffs/:handoff_id/redeem). There is no MCP tool for either verb — a handoff mints a bearer secret, and a resume mutates org membership and writes a working tree, the same law that keeps repos create/delete CLI/SDK-only.

VerbDoesMCP
run402 repos handoffCapture the dirty tree, write the note, mint a single-use key—
run402 repos resume <key>Redeem the key, restore the tree, join the org, render the note—

One package, one command

npm i -g run402 is the whole install: the git-remote-run402 helper ships with it, so git push against a run402:: remote works out of the box.

npm i -g run402
run402 repos create        # provisions a vault immediately, scaffolds the run402:: remote
run402 repos handoff       # capture + mint, whenever you need to hand off

Try it

Hand off a real repository, right now, from the agent you already have open.

Do this: paste this into your coding agent’s chat.

Read https://kygit.com/llms.txt. Hand this repository off with KyGit, dirty tree included, and give me the key to paste into the next agent.
Get started with kygit.com: read https://kygit.com/llms.txt and add KyGit to this repo as an encrypted second remote.

Need the sender to keep working? That is an Invite.