v0.14.0 · open source · Apache-2.0
Ask an agent
View as Markdown
Ask ChatGPTAsk Claude

Code moves by copying. Capability moves by teaching.

Transferable build recipes for AI agents.

sporo turns a build you already did into a recipe — one self-contained file any AI agent can rebuild from, on its own stack, in a repository that has never seen yours. Your scars included, so nobody pays for them twice.

Works with any agent
Claude CodeOpenAI CodexCursorGitHub CopilotGoogle GeminiWindsurf
Set up sporoone binary · then sporo init
Hand it the seedsealed

Give any agent this line. It reads the sealed sporo seed — a human-auditable install recipe, not a script — then works through it in your repo, detecting first and proving each step.

Read https://sporo.dev/seeds/sporo.md and follow it to set up sporo in this repo

Or read it first: the seed as Markdown ↗ — every step is there to review before an agent runs it.

$curl -fsSL sporo.dev/install.sh | sh
one static binarymacOS · Linux · Windowslatest release 25 binary downloads
01 — INSTALL
One command, one binary.

Nothing else lands on the machine.

02 — INIT
sporo init in your repo.

It writes the sporo-recipe and sporo-seed skills into your agent and a starter config — the authoring surface, ready in this repo.

03 — AUTHOR
The skill drives your agent.

sporo-recipe walks it through harvest → draft → lint → seal → export, on the record, not from memory. You review one file.

11 gated sections per recipe20 CLI verbs6 platforms, checksummed0 accounts, servers or runtimes
the core idea

Package anything. Rebuild it anywhere.

A single prompt, a module, a whole project, an entire microservice — sporo distils it into one portable recipe. Not the code: the principles, contracts and scars that make it work. On the far side an agent germinates it back into the real thing — on a different stack, in a repo that has never seen yours.

package anything
skilla single prompt
modulea library / package
projecta whole codebase
servicean entire microservice
one recipe
self-contained file
sealedcontent-hashed
rebuild it anywhere
The same capability, re-derived
a different language & stack
a different agent & harness
a different company entirely
governed by, not copied from
principlescontractsscarsDone-when gatesverification
01what is a recipe

Not a prompt. Not a template. Not a packaged skill.

A recipe is transferable, verifiable build intent. The name comes from spore — the minimal portable unit that grows the organism in a foreign environment. A recipe carries that minimum — principles, contracts, scars — and leaves behind everything that only makes sense in your repo. Read a real one → · browse the corpus →

a skill
runs where
inside the harness that defines it
assumes
your tools, your paths, your conventions
transfers
by copying the package
on failure
breaks silently when the harness drifts
a recipe
runs where
anywhere an agent can read and act
assumes
nothing — it probes and maps
transfers
by being rebuilt, once, from scratch
on failure
loud by design — every step carries its own acceptance
02the genre

A summary, then eleven gated sections. None decorative.

A recipe isn't free-form prose — it's a fixed shape a linter enforces: neutrality (roles, never your paths or product names), a Done when: on every build step, and scars that carry symptom, root cause and fix. The full genre →

01The problem — acceptance at the top, in the reader's terms
02Why the obvious approach fails — the dead end, named
03The principles — the payload; portable claims
04The ground it needs — preconditions, each as a ladder
05The contracts — shapes shown, each with its binding
06The build sequence — a Done-when per step
07The seams — what stays configurable, and why
08The scars — symptom → root cause → fix, earned
09Verification — gates ship with the capability
10The trade-offs — including when not to build it
11For the human — the one section written for you
from a real recipe — the scars section

The day that was 25.3 hours long

Symptom: the effort total exceeded the length of the day it reported.

Root cause: summing parallel agent sessions measures machine busy-time, not elapsed time — two different questions, silently added.

Fix: report both, name the method next to each number, never add them.

A clean-room rebuild cannot produce this section. That's why it's the most valuable one.
03how it works

Author once. Rebuild anywhere. Improve on every return.

The author side

  1. sporo harvest — mine the repo's own record; scars come from history, not memory
  2. sporo new — a coached draft, scar candidates pre-seeded
  3. sporo lint — the genre gate: shape, scars, neutrality
  4. sporo seal — version + content hash; sealed text never silently mutates
  5. sporo export — one self-contained file. Hand over this, never the source

The reader side

  • Probe, don't assume — every precondition checked against the real repository
  • Map rolesthe facts file, the collector: the reader decides where each lives here
  • Agree the outcome — which outputs, in what form, confirmed with a human first
  • Never substitute silently — degrade honestly, label it in the output

The loop

  • Report-backs are new scars
  • New scars raise the version
  • Today's recipe has already absorbed a failure you'd hit next month
  • The moat isn't the file format. It's this loop.
authorexportrebuilt on a foreign stackreport backnew scar → new version
04for teams

One schema. Ten stacks. Zero drift.

The team case: everyone rebuilds a reporting system on their own stack, but one shared consumer parses every feed. In a recipe that shape is marked Binding: exact — and exact is enforced, not promised:

  • The seal refuses a change to an exact shape under anything less than a major version — a break never ships wearing a compatible number
  • Fixtures travel with the shape — a valid instance, and the mutations a consumer must reject; the linter runs them
  • Every adopter checks their own output in CI, against the handed-over file alone — no checkout of your repo, no account, no server
$ sporo conform handoff.md my-feed.json
# the renamed field a consumer would miss:
   contract #1 $.counted: missing — the consumer
    parses this field and will starve without it
   contract #1 $.tallied: not in the contract
$ sporo conform handoff.md fixed-feed.json
sporo conform: contract #1 ✓
05 · why prose, not packages

Readable before it runs. Self-checking after. It makes the result check itself.

A skill package is opaque until it runs: you trust it or you audit its code. A recipe is prose — a human reads it and decides whether to let an agent act, before a single line executes. Every step carries its acceptance, verification gates ship with the capability, exact-bound schemas are checked mechanically.

06when not to use it

Recipes are not the right tool everywhere.

  • Same stack, same harness, same company — hand over the code, or package a skill. A recipe re-derives what you could have copied.
  • Determinism matters more than adaptability — zero re-derivation cost beats a document an agent has to interpret.
  • The capability is one library call — the recipe is the install command.
  • Nothing went wrong building it — a build with no scars didn't need a recipe.

Recipes earn their cost where the destination is genuinely heterogeneous: a different stack, a different agent, a different company — and code that literally cannot be handed over. That's the wedge: private teams transferring capabilities across a boundary code can't cross.

07get sporo

One binary. No runtime. No dependencies.

$ curl -fsSL sporo.dev/install.sh | sh
$ sporo init          # install the authoring surface into a repo
$ sporo genre         # read the rules the gate enforces
Updating later: sporo upgrade (the binary), then sporo update in each repo (its skills). The binary hints — one quiet line, at most once a day — when a newer release exists.

macOS (Apple Silicon & Intel), Linux, Windows — amd64 and arm64, checksums published with every release. Apache-2.0, source on GitHub.

go install sporo.dev/sporo/cmd/sporo@latest works too; a brew tap follows.

signed · provable · auditable

Don't take our word for it — verify the binary.

Every release is signed with cosign — keyless, so there's no signing key you have to trust — and carries a SLSA build-provenance attestation binding the binary to this repository's release workflow, plus a full SBOM. Confirm what you downloaded is really ours, offline, in two commands:

# build provenance — who built it, and from which commit
$ gh attestation verify \
    sporo_…_linux_amd64.tar.gz \
    -R ydnikolaev/sporo
✓ built by ydnikolaev/sporo · release.yml
# signature — the keyless cosign bundle over checksums
$ cosign verify-blob \
    --bundle checksums.txt.sigstore.json \
    checksums.txt
Verified OK
…and the source it's built from is continuously scanned