On 2026-08-06 an agent bought a bottle of water for 10 cents on Solana mainnet. Before
paying, Gecko said exactly what the transaction would do — and that is exactly what
happened. Since then it has happened fifteen times out of fifteen — across two
storefronts and several account states, the last four signed inside a hardware enclave
with no key on the machine that planned them. See every signature; they are
public, so you can check rather than trust us.For the technically minded: each receipt predicted the exact compute units the chain
then charged — 36,508, then 36,399, then 22,527 for a different store — matching to the
unit, because the simulation runs the identical execution against the state it will land
on, not an approximation of it.

Untrusted surfaces → a provenance knowledge graph → verified action: simulate to a receipt, then hand off to an external signer.
The brand is Gecko. The CLI is
gecko — install it with
npm install -g @geckovision/gecko (prebuilt binary, no Python) or from PyPI as
gecko-surf (pip install gecko-surf / uv tool install gecko-surf). The import is
gecko (from gecko import …).Why a description isn’t enough
A specification tells you what a call looks like. It cannot tell you whether it will work. That is structural, not a quality defect — it is just as true of a perfect spec:- Nothing in a spec runs.
/v1/assets/{symbol}/stateis schema-correct withsymbol="string". Live, that call is a 404. Only running it tells you. - Some facts can’t be in a spec. Jupiter’s route surface declares 9 accounts; the instruction that lands carries 25. The other 16 are legs of a route computed a second ago — facts about a different surface.
- A spec can’t declare a join to a spec it’s never heard of. The mint that connects three Solana APIs is named differently in each and declared by none.
- A spec is a snapshot. Nothing in it says when it stopped being true.
Provenance on every edge
Every fact is tagged
extracted from the surface, recovered from source, or
honestly flagged as unknown. Never fabricated. Below the retrieval floor, Gecko
says “no start found” instead of inventing one.The receipt
An action is simulated on a $0 mainnet fork first, producing a Receipt: pass,
or a categorical revert class — before any spend. See The Receipt.
Drift
Outcomes land in a categorical corpus; an N-confirmed drift series flags when a
provider ships a change that breaks a working call. See Stay correct.
Auth invisible to the agent
Keys are injected at call time from your OS keychain. The model never sees a
credential, and no key goes in
mcp.json. See Access & auth.Who this is for
Not “teams with bad APIs.” The gap above is in every spec. What changes is what a wrong call costs you:- The call spends or commits something. There is no retry loop when the first attempt is the real one.
- The agent runs unattended. Nobody reads the diff before it happens.
- You are on your Nth surface. The cost is per-API and it compounds.
Proof, not promises
Live, on a surfpool mainnet fork (a mainnet-backed state snapshot — not mainnet), simulation only, $0, nothing signed or broadcast:
The facts behind those passes are not on any surface: a 4th PDA seed the SDK added in
2024, an account the IDL only mentions in prose, a fee field resolved by a refuting
simulation. That is the graph your agent traverses.
Compute-unit numbers are measured per run against a fork snapshot and vary slightly
with on-chain state. The stable claim is the side-by-side verdict: the naive path’s
revert class vs Gecko’s pass. The
base_factor row is a derivation result — it has
no CU number and is never paired with one.Where Gecko sits
Gecko is not the agent and not an orchestrator. It is the memory-and-context substrate under other people’s agents: it comprehends external surfaces, projects them as first-call-correct tools over MCP, verifies actions by simulation before execution, and never signs, never broadcasts, never stores payloads. There are three distinct jobs in the agentic economy. Gecko does exactly one.
Gecko composes on top of MCP, x402, and payment catalogs — it consumes them as
input. It is not a payment rail and not a marketplace. Building transactions belongs to
builders; signing belongs to signers. That is the design, not a gap.
Control plane, never data plane
Gecko holds the API’s surface, the generated tool defs, and correctness metadata. It never stores response payloads, user data, or secrets. That invariant is what lets it ingest a surface unilaterally — and it is a hard boundary, not a setting.Next
Quickstart
doctor → add → report → serve. The $0 recorded path — no key, no spend.
Architecture
The three views, with the interactive diagrams.
The Receipt
What a Receipt asserts — and, in detail, what it deliberately does not.
find_start
Intent → the right starting point, with a provenance-tagged derive plan.
Concepts
Surface, provenance, receipt, drift, question-shaped tool, the two modes.
Status
What works today, and what is honestly not built yet.