Log inGet in touch

Coding agents should scale you.

A dozen tasks, each in its own sandbox. Stop watching turns. Start making decisions.

Get in touchhello@tinsmith.dev
The problem

One agent. Every turn, you wait.

An agent reads, edits, runs the tests and tries again. You half-watch a terminal.

Run a dozen on your laptop, and you're juggling a dozen worktrees, dev servers fighting over ports, and one database every branch steps on.

Even when that works, your attention becomes the limit. The question is what it costs to check on one.

If it's a transcript, a dozen is worse than one. If it's the diff, the failing test and a terminal already open, a dozen is easy.

More in flight

A sandbox for every task.

Ready from the start.Repository cloned. Database and services running. Dev server up on its own port.
Twelve tasks. Twelve sandboxes.No shared working trees, branches or ports. All start at once, usually from a cached image.
Still there after the turn.The sandbox stays up when the agent stops. There's always something to step into.
fix-webhook-retryT-142
queued
invoice-export-qbT-201
queued
coverage-prorationT-207
queued
session-redisT-188
queued
drop-v1-exportT-176
queued
idempotency-keysT-163
queued
paginate-audit-logT-159
queued
pg-driver-bumpT-214
queued
rate-limit-headersT-216
queued
audit-authT-231
queued
timezone-reportsT-210
queued
triage-schedule-retryT-219
queued

Your config declares the services. Tinsmith starts each in its own container and waits for its health check before anything runs against it.

.tinsmith/config.json▸ Place on host
{
"version": "1",
"devbox": {
"dockerfile": ".tinsmith/devbox/Dockerfile",
"env": {
"DATABASE_URL": "postgres://app:app@postgres:5432/app",
"REDIS_URL": "redis://redis:6379"
},
"services": {
"postgres": {
"image": "postgres:17-alpine",
"env": { "POSTGRES_USER": "app", "POSTGRES_PASSWORD": "app", "POSTGRES_DB": "app" },
"health_check": { "cmd": "pg_isready -U app -d app", "interval": "5s", "retries": 20 }
},
"redis": {
"image": "redis:7-alpine",
"health_check": { "cmd": "redis-cli ping", "interval": "5s", "retries": 20 }
}
},
"launch_commands": [
"pnpm install --frozen-lockfile",
"pnpm db:migrate"
],
"processes": {
"web": {
"command": "pnpm dev --host 0.0.0.0",
"auto_start": true,
"ports": [{ "port": 5173, "public": true }]
}
}
}
}
Fix the flaky webhook retry on slow networksT-142Provisioning
NB
You10:42
The webhook retry test is flaky on slow networks. Find out why and fix it.
SYSTEMSandbox provisioning…10:42
  1. Place on host—
Cheap to drop into

Four ways in.

This task failed the same test three times and asked for help. Open it, and you're inside its sandbox.

ChatDiff+38 −12TerminalsServices
pnpm test webhooks/retry1 failed
pnpm test webhooks/retry1 failed
pnpm test webhooks/retry1 failed
TinsmithSame failure three times. The retry schedules on the wall clock and the test fakes timers, so the retry never fires. Either side could change, and that's your call.
terminal · fix-webhook-retry
~/api $ pnpm test webhooks/retry
✕ retries after a slow response (30012 ms)
~/api $
src/webhooks/retry.ts
− setTimeout(() => run(job), delay(job))
+ clock.after(delay(job), () => run(job))
web · :41207public
Webhook deliveriesinvoice.sentretrying
ChatThe reasoning behind every change.
DiffWhat it actually changed. Comment on any line.
TerminalA shell in the agent's own sandbox. Not a copy.
The running appThis branch, live, at its own URL.

Four views of one sandbox. No transcript to piece together.

Cheap to drop out of

Look away. Nothing stalls.

Red checks go to the agent.Not just to you. Sent once, the moment a check turns red.
Reviews become work lists.The agent answers every comment and flags what it touched.
Conflicts get rebased in place.When one is real, the agent is already there.
Merge when ready.Arm it once. It merges when the checks pass.

Nothing lands without you. Your absence just doesn't stall it.

Tinsmith needs your input
Retry clockThe test fakes timers, but the retry schedules on the wall clock. Which side should change?
1Inject the clock into the retry2Raise the test's timeout3Skip it and file a task
More in flight

Big job? The agent splits it.

Audit a dozen packages. Port forty call sites. Try three fixes at once. Each piece becomes its own task.

Each starts clean.A fresh clone of the base branch, blind to the others. Nothing collides.
You see all of it.Every piece is a card on the board, named in the parent's thread.
Your fleet sets the limit.More hardware, more pieces in flight.
Audit every package for unvalidated input
audit-inputRunningT-230
Filed 12 tasks, one per package.
Audit packages/authaudit-authRunning
Audit packages/billingaudit-billingRunning
Audit packages/searchaudit-searchNeeds input
Audit packages/uploadsaudit-uploadsPending
Audit packages/webhooksaudit-webhooksPending
Automations

Work that starts itself.

A new Sentry error. A Linear ticket labelled agent. A new GitHub issue. A failing check on main. Each can start an agent.

3 a.m. A new error. By morning, an agent has read the trace, found the commit, reproduced the bug and written it up, on the ticket and in a draft pull request.

You decide what merges.

Sentry · api · production03:12
TypeError: Cannot read properties of undefined (reading 'retryAt')
New issue · 41 events · 9 users
rule · sentry-new-error
Sentry: new error in api
Triage: TypeError in scheduleRetry
Reproducing
TypeError: Cannot read properties of undefined (reading 'retryAt')
at scheduleRetry (src/webhooks/deliver.ts:88:23)
at deliver (src/webhooks/deliver.ts:41:12)

A rule reads like a sentence.

When this arrives, if this holds, unless it's handled: start an agent, and tell it this.

In the repository.Rules live in .tinsmith/config.json, reviewed like any CI workflow.
Fires on the change.A ticket that becomes labelled starts one agent. Later comments start none.
Shadow mode first.See what a rule would have done against the last 30 days of real events, before it spends anything.
It can't run away.Concurrency and rate caps. No re-triggering from its own pull requests. Rules that misbehave switch off. Admins choose the repositories, and the account they run on.
Just another task.On the board, with a chip naming the rule and the full event attached.
The loop closes itself.The pull request names the ticket, so it resolves on merge.
.tinsmith/config.jsonexcerpt
"automation": {
  "rules": {
    "agent-label": {
      "name": "Linear: ticket labelled agent",
      "on": "linear.Issue.update",
      "edge": "became",
      "if": "payload.data.labels.exists(l, l.name == 'agent')",
      "mode": "armed",
      "instruction": "Implement this ticket. Put `Fixes` and the ticket identifier in the pull request body so Linear links them."
    }
  }
}

Automations start the work. You still decide what lands.

Integrations

One connection, both directions.

Events come in and start agents. Agents reach back out over MCP to read the trace, the thread or the timeline, and to comment or move the ticket on.

Connection→ Events in← Over MCP
SentryNew and regressed errors start agents.Agents read events, stack traces and breadcrumbs.
LinearLabelled or newly filed tickets start agents.Agents read the thread, and comment or change status.
GitHubNew or labelled issues and failing checks.No setup. You're already connected.
AlsoPagerDutyDatadogJiraZendeskSnyk

No rule needed to ask, either. Paste a Sentry link into a task, and the agent goes and looks.

Configuration

Declared once. Built the same every time.

Configuration is declarative. One committed file names the image, the services, the launch commands and what every agent should know.

Sandboxes are deterministic. Each one is built from that file on the task's branch, the same way every time. Same config, same sandbox.

Every agent reads it, so nobody re-teaches. A repository can add to the prompt, never replace it.

.tinsmith/config.json
{
  "version": "1",
  "agent": {
    "append_prompt": "Run lint, format and typecheck before every commit, and fix what they report rather than silencing it."
  },
  "devbox": {
    "dockerfile": ".tinsmith/devbox/Dockerfile",
    "services": {
      "postgres": { "image": "postgres:17-alpine" },
      "redis": { "image": "redis:7-alpine" }
    },
    "processes": {
      "web": {
        "command": "pnpm dev --host 0.0.0.0",
        "ports": [{ "port": 5173, "public": true }]
      }
    }
  }
}
Where it runs

Your hardware, our control plane.

How parallel you can be is a question about your hardware, not your plan.

The control plane stays awake when you don't, so a failing check at 3 a.m. still reaches an agent. Hosting it means one GitHub App, not one per company.

Self-hosted is for security reviews that rule out anything hosted.

you → dashboard ↓
Hosted control planeTinsmith
API · database · PR & CI sync · preview · automations
← GitHub App + webhooks← Sentry, Linear, … events
Your hardwareyours
Runner → one sandbox per task

What leaves your hardware

CloudHybridSelf-hosted
Code runs and the checkout livesTinsmith runnersYour hardwareYour hardware
Chat, diffs and terminal output are storedTinsmithTinsmithYour servers
Preview traffic passes throughTinsmithTinsmithYour servers
Repository secrets are stored, encryptedTinsmithTinsmithYour servers
Model inferenceAnthropic APIAnthropic APIAnthropic API
Nothing connects in.Runners and sandboxes dial out. No ports to open.
The fleet is the only limit.No caps. No settings. Want more agents? Add a box. On Cloud, add runner-hours.
Pricing

Three ways to run it.

Cloud
No hardware to hand? Use ours.
$75 per seat / month
+ $0.80 per runner-hour (8 vCPU)
Control planeTinsmith
RunnersTinsmith, metered
Model usageYour Anthropic API key
Get in touch
Self-hosted
All of it, inside your network.
Talk to us
Annual licence
Control planeYour servers
RunnersYour hardware
Model usageYour Anthropic API key
Get in touch

Model usage is billed by Anthropic to your own API key.

Questions?

Does our code leave our hardware?

On Hybrid, the code runs and the checkout lives on your hardware. Chat, diffs and terminal output are stored by the control plane, and previews pass through it. On Self-hosted, nothing leaves except what the agent sends to the model. On Cloud, everything runs on ours.

What does a runner need?

A server or VM with Docker that can reach the control plane. Install a small daemon, give it a one-time key, and it connects out.

How many agents can run at once?

As many sandboxes as your runners hold. By default a runner offers one per vCPU.

Who pays for model usage?

Anthropic bills your API key directly.

Which models are supported?

Anthropic's models, for now. If you need another provider, tell us which and we're happy to add it.

Which Git hosts?

GitHub, for now.

Which tools can start an agent?

Sentry, Linear and GitHub, plus PagerDuty, Datadog, Jira, Zendesk and Snyk.

What stops an automation from running up a bill?

It's off until an admin turns it on. Every rule has concurrency and rate caps, can't re-trigger itself, and switches off when it misbehaves. Shadow mode shows what it would do first.

Do the agents merge without us?

No. They open pull requests and respond to CI and review. You decide what merges.

Let's scale you.

Tinsmith isn't open yet. Got a repository and a box to run it on? Write to us at hello@tinsmith.dev.

Write to us