v0.9.650 shippedmacOS, Windows, Linux

A desktop coding harness with Puppetmaster built in. Durable swarms, cost-aware routing, and a receipt for every run.

Free, with the full source on GitHub. Bring any provider key. Or install from the terminal.

Marionette · marionette · dev real capture
ROUTING · conflict-auditor
gpt-6.1-sol, capability 85 ≥ 85, $0.0186 est.
51 models scored. Every rejection has a reason.
LEASE RENEWED
task_cd6f9879a3df
test-coverage-reviewer · ttl 5s · heartbeat
CACHE AFFINITY · explore
Kept its sibling's gpt-6.1-sol so the shared job brief stays cached.
needs 73 · recorded as a routing artifact
RECEIPT · job_338f29ad552d
276,765 worker tokens. $0.21 at API prices.
$1.27 avoided vs. claude-opus-5

Real capture, not a mockup. Claude Sonnet 5.5 piloting three GPT-6.1 Sol workers on Marionette's own source, all through one OpenRouter key at API prices. Recorded at 2240×1400. The 67-second swarm is time-lapsed; the prompt and the answer play at real speed.

One real turn

Watch the run
from the inside.

The same session as the video, slowed down. One sentence in, a three-worker audit out, and a record of everything that happened in between.

1You ask

Plain language in. The pilot decides how deep to go.

Every turn is sized as MICRO, STANDARD or DEEP before the model acts. This one asked for a swarm, so the pilot hands it to the kernel instead of grinding through one long context window.

2The kernel takes the job

Three roles. Three leases. One durable job.

Puppetmaster splits the audit into an explorer, a conflict auditor and a test coverage reviewer. Each role gets a capability bar, a routed model, and a five-second lease that a heartbeat keeps alive.

3Workers write to state

Findings land in SQLite while the run is still going.

This job wrote 25 artifacts, each with a sha256: 11 findings, 2 risks, 3 decisions, 6 verifications and 3 routing records. All three workers finished in 67 seconds and graded their own coverage PASS, so the tracker marks the job done. A worker that fails or comes back partial is marked that way instead of painted green.

4The answer streams

One answer, and it says what it checked.

The pilot ranked six findings with file and line, re-read the regex behind the top one to confirm it, and closed with what to fix first.

5You get a receipt

Depth, tokens, cache and dollars, in the status bar.

The meter runs live: turn depth, tokens, cache hit rate and actual spend, plus what your plan covered when a plan pays for the tokens. The job receipt prices each worker against the model registry in force when it finished.

Marionette with the swarm request sent and the expanded Swarm Tracker listing three routed workers The expanded Swarm Tracker mid-run: two of three workers finished, 180,418 tokens, every role routed to gpt-6.1-sol The pilot's ranked findings beside the finished job: three workers complete, job done
01composer → pilot
The orchestration kernel

Puppetmaster is
the kernel.

The pilot never babysits workers. The kernel owns them: leased tasks, heartbeats, a typed artifact store and a job graph. Below is the actual event log from the run above, replayed.

job_338f29ad552d · mode=analysis (read-only) · state.sqlite3 queued
finding 0 risk 0 verification 0 decision 0 routing 0 replayed from the job's event table, time-compressed

Leases, not hope

A worker holds a lease and renews it on every heartbeat. A dead worker forfeits it and the task is recoverable.

Typed artifacts

Findings, risks, decisions and verifications carry confidence, citations and a content hash.

A job graph

Every task links to what it produced. 26 edges in this job, queryable after the fact.

Zero-token recall

Pull a finished job's results into any later session without re-running a single model call.

Cost-aware routing

The cheapest model
that clears the bar.

Every task carries a capability requirement. The router scores every model you allowed, picks the cheapest one that clears it, and writes down why it turned down the rest. These are the real routing records from the run.

routing artifact · reason
51candidates scored on a first route, with a written reason for each one turned down.
Auto-fallbackA rate-limited worker is re-routed to the next model that clears the bar, and the switch is recorded. Explicit pins never get silently swapped.
Cache affinitySibling tasks keep the same model when it still clears the bar, so the shared job brief stays cached.
The harness

Everything a long session
needs, in one window.

Any model can pilot.

Every model your keys can reach, in one searchable picker. The profile in these captures lists 621 across OpenRouter, OpenAI, OpenCode Go and OpenCode Zen. Swap the pilot mid-session and keep the thread.

The Marionette model picker filtered to every Claude Opus variant on OpenRouter, above the composer

CodeGraph first.

Symbols, callers and impact are injected before the model acts. 37,285 nodes for this repo, refreshed as files change.

The State pane showing CodeGraph ready with 37,285 nodes, Wiki and MCP

Your keys, your allowlist.

Toggle what the picker and the router may use. One Full stack key runs both pilot and workers.

Settings, Models: OpenRouter 451, OpenAI 89, OpenCode Go 36, OpenCode Zen 45

Answers cite the code.

DeepSeek V4 Flash traced the routing path with file and line on every step, at 91% cache and $0.01 at list.

A pilot answer citing harness/swarm_worker_allowlist.py:229-262 and other file and line references

It tells you what it did not do.

This edit landed with four tests. The pilot also said pytest was missing in that checkout, and exactly how it checked instead.

The pilot's edit report, noting it did not run the pytest suite and listing the new tests
Honest token economics

Receipts,
not vibes.

A model vendor's harness sells you tokens. Marionette earns nothing on your token count, so every incentive points at spending less and proving it.

0
worker tokens, measured
cost_receipt.token_usage
$0.00
actual cost at API prices
billing: api · openrouter
$0.00
avoided vs. the same tasks on claude-opus-5
counterfactual.avoided_usd
0
models scored per task
routing.rejected[]
Status bar: idle, depth DEEP, 430.1k tokens, 28% cache, about $0.39 spent this session
The status bar at the end of this run, cropped straight from the capture.
  1. Send less

    CodeGraph-first retrieval injects the symbols that matter instead of whole files, so prompts start small.

  2. Re-send cheap

    Prompt caching with a stable and a moving breakpoint across Anthropic, OpenAI and Gemini serves the heavy prefix from cache every turn.

  3. Bill honestly

    Cached tokens are priced at the real cache-read discount, and unknown prices stay unknown instead of turning into a quiet $0.

  4. Route down

    The router will pick a competitor's open-weights model when it clears the bar. A first-party tool will never route you off its own tokens.

Evidence

Measured,
then published.

SWE-bench Lite · cost at equal quality
0%cheaper

CodeGraph context plus the router, against the frontier baseline, at equal quality.

Frontier baseline1.00x
Marionette stack~0.53x

A controlled three-arm study holds the model ceiling constant and varies only the orchestration. Frozen predictions re-grade deterministically with Docker alone, no API keys.

NL2Repo-Bench · build a library from a spec
0%mean test pass

About 2.28x the roughly 40% published state of the art, with 53% of libraries reaching a fully green upstream suite.

Published SOTA~40%
Durable state91.1%

Durable-state orchestration on whole-repository generation from a spec. Full method and caveats are in the paper.

Also published: Extractive Residuals After Compaction, the compaction method Marionette ships by default.

Also in the box

Built for work that
outlives a chat.

memory

Portable LLM Wiki

Sessions distill into markdown pages you own: decisions, entities and handoffs that any model can read next month.

autonomy

Full-auto with a governor

Unattended runs bounded by token, time, swarm and idle ceilings, plus a killswitch file.

safety

Command guard

In full-auto, recursive deletes, force-pushes, curl-to-shell, sudo and key exfiltration are screened before they run.

schedules

Scheduled runs

Cron-backed local runs with transactional claims, restart recovery and a truthful run history.

vision

Vision on any driver

Text-only pilots get a VLM sidecar from a key you already have. Vision-capable pilots get the real pixels.

context

Compaction that keeps handles

Long sessions compact to an extractive catalog with handles back to what was dropped. Read the paper.

git

Worktrees in the rail

Projects, branches, worktrees and sessions side by side. Implement workers build in clean worktrees.

tools

Browser, terminal, computer use

An in-app browser, a real terminal, and scoped native control with password fields masked.

extend

MCP and plugins

Add any MCP server by URL or Docker from the State pane. Tools are discovered, not hard-coded.

updates

Runs from source, updates itself

Stdlib-only Python backend with one real dependency. The update pill pulls, rebuilds and relaunches, and keeps your local edits.

Run it
tonight.

Free, with the source on GitHub. Paste one provider key in Settings and both the pilot and the workers run on it. No other CLI required.

Installers for macOS (universal), Windows and Linux.

Updates are continuous. The in-app update pill runs git pull, rebuilds and relaunches, so a merge reaches every install on its next click.