Scale your agents.
Keep your standards.

Fletch runs every coding agent in its own sandbox, on its own clone of your repo. It indexes your code so agents stop grepping, walks you through each change, and gets the pull request to green.

Download for macOS
Free and open source · macOS 13+
CodexCursor
Claude Code, Codex, Cursor, OpenCode and Pi, on your own plans. No middleman, no markup.
01 · Sandbox: one per agent
02 · Code index: query, don't grep
03 · Review: walkthrough to green PR
  • 01 · Sandbox: one per agent
  • 02 · Code index: query, don't grep
  • 03 · Review: walkthrough to green PR
01 — Sandbox

Every agent runs in its own sandbox.

On Apple silicon the default is a Linux VM holding its own clone of your repo. A bad command can only write to that clone and the folders you share with it.

Intel Macs and macOS or iOS app projects use the macOS sandbox: write protection only.

›_Codegraph·explorecreateCheckoutSessionreconcileSubscriptionRow
02 — Code index

A code index, so no agent starts cold.

Fletch indexes your repo's symbols and call graph and serves them to agents over MCP. One query returns a definition, its callers and what a change would break.

Works with Claude Code, Codex and OpenCode.

03 — Review

Every diff comes with a walkthrough.

The agent explains its change step by step, each note beside the lines it covers. Add a reviewer agent on the model of your choice, and every pull request gets a second read as it opens.

Step 1 of 7Step 2 of 7Step 3 of 7ReviewerCheckout no longer renders Elements. It redirects to the portal.The webhook handler verifies, de-duplicates, then reconciles.One upsert keeps local subscription state behind Stripe.Codex reviewed 5 files · 2 findings
src/billing/checkout.tssrc/billing/webhooks/stripe.tssrc/billing/portal-sync.tssrc/db/subscriptions.tssrc/billing/webhooks/stripe.ts
@@ -19,4 +19,7 @@ createCheckoutSession(user: User)
1919  const origin = env.APP_URL
20−  const elements = stripe.elements({ clientSecret })
21−  elements.create("payment").mount("#pay")
20+  const session = await portal.sessions.create({
21+    customer: user.stripeId,
22+    return_url: `${origin}/billing`,
23+  })
24+  return redirect(session.url)
2225}
@@ -10,1 +10,8 @@
1010import { reconcile } from "../portal-sync"
11+export async function POST(req: Request) {
12+  const event = stripe.webhooks.constructEvent(
13+    await req.text(), sig(req), env.STRIPE_WHSEC)
14+  if (await seen(event.id)) return ok()
15+  await reconcile(event)
16+  return ok()
17+}
@@ -5,1 +5,8 @@
55import { db } from "../db"
6+export async function reconcile(e: Stripe.Event) {
7+  const sub = e.data.object as Stripe.Subscription
8+  await db.subscriptions.upsert({
9+    id: sub.id, status: sub.status,
10+    renewsAt: sub.current_period_end,
11+  })
12+}
14+  if (await seen(event.id)) return ok()
HIGHwebhooks/stripe.ts:14Reviewer · Codex

Seen event IDs are kept forever. Add a TTL, or this table grows without bound.

Added a 72h TTL index. Pushed a41c9e2.✓ resolved
LOWportal-sync.ts:6renewsAt is seconds; the column is ms.✓ resolved
04 — Autopilot

From diff to green PR,
without babysitting.

One button is always the next step. When checks fail, the branch conflicts or a reviewer comments, autopilot hands it back to the agent and the fix gets pushed. Autopilot never merges. That click is yours.

feat/billing-flow → main+187−64
Commit
Push
Open PR
✕
Checks
Merge
5 files changed. No PR yet.PR #214 is open. 12 checks running.CI failed on lint. Autopilot handed it back to patagonia.Fix pushed. Checks are running again.All checks passed. No open review comments.You merged PR #214 into main.
Autopilotstanding by1 action2 actions3 actions
Nothing to do yet. Autopilot steps in when checks fail, the branch conflicts or a reviewer comments.
CI failed on lint. Handed back to patagonia.
Fix pushed a41c9e2. Checks re-run.
Reviewer comment resolved. Thread closed.
Autopilot never merges.
05 — iOS app

Watch and steer your agents from your phone.

Pair the iOS app with your Mac to follow every agent, send the next message, approve what it asks for and merge the PR. Agents keep running on your Mac, and the link is end-to-end encrypted.

06 — Roadmap

Start from a goal,
not a prompt.

Tell the project manager agent what you want built. It reads your repo and proposes tickets, and you decide which ones land on the roadmap. Send a ticket to an agent and it comes back as a pull request.

GOALMove billing to Stripe's hosted portalplanning4 tickets2 agents running1 in review
ROADMAP
The project manager is reading billing-web.
Portal session on checkoutbilling/checkout.ts
Webhook reconcilerbilling/webhooks/stripe.ts
Remove legacy Elements flowbilling/elements.tsx
Billing settings pageaccount/billing.tsx
Remove legacy Elements flowbilling/elements.tsx
Billing settings pageaccount/billing.tsx
Billing settings pageaccount/billing.tsx
IN MOTION
Send a ticket to an agent to start it.
Portal session on checkoutpatagoniaLinux VM
Webhook reconcilercaspianLinux VM
Webhook reconcilercaspianLinux VM
Remove legacy Elements flowhokkaidoLinux VM
IN REVIEW
Finished work lands here with its PR.
Portal session on checkoutPR #214✓ checks green
Also in the app

More things you'll use every day.

ForkRewind

Fork and rewind.

Fork a conversation into a new workspace, or rewind one with its code.

ArchitectReviewer

Custom agents.

Give an agent a name, a model, a standing brief and its own skills.

2sub-agents

Sub-agents in plain sight.

Nested under the agent that started them, each with its own status.

62K/ 200K

Context you can see.

A meter shows how full an agent's context window is.

RunTerminal

Run it where it was built.

Start the dev server or a shell in the agent's own checkout.

⌘⇧D

Dictate the task.

Speak instead of typing. Transcription happens on your Mac.

Scale your agents.
Keep your standards.

Free and open source · macOS 13+

Runs on your Mac.

Agents work in sandboxes on your own machine. No account needed.

Your CLIs, your plans.

No middleman and no markup on the subscriptions you already pay for.

Your secrets stay out.

SSH keys, Keychain and env secrets stay on your Mac, outside the VM.