Teploy Shipopen source, self-hosted

The coding agent that
proves its work.

Ship works a task in a sandbox on your servers, then runs the evidence itself: tests, a deployed preview, a browser flow, and a window of production telemetry after the merge. The pull request carries the results. The agent's word is never the evidence.

$teploy template install teploy-ship --server prod
Ten-minute quickstart
ship — run-4f2c91ab · acme/apiworking
nowqueued$0.00 of $4.00
  1. intake#412
  2. sandboxwarm
  3. work1 file
  4. build9f3c21
  5. tests47 passed
  6. previewsmoke 3s
  7. flow9 steps
  8. mergemerged
  9. observeclean
Evidence
baselinesuite green before the edit
buildacme-api:9f3c21
testsgo test ./... — 47 passed
previewpr-412.preview.acme.dev, smoke 3s
flowauth-refresh.spec.ts, 9 steps
observe30m window, errors 0.41% to 0.06%
pull request #128ready
fix: guard token refresh race
ship/run-4f2c91ab into main · +11 -4 · 1 file
Verification
passed tests · go test ./... — 47 passed
passed preview · pr-412.preview.acme.dev
passed flow · auth-refresh.spec.ts
skipped visual · not declared
authority auto_normalobserve 30m
inbox — proposed3
github#414 rate-limit the webhook endpointpropose
cimain is red: TestRefresh flakyauto
slackadd a CHANGELOG entry for 0.3propose

Every coding agent returns a pull request. Ship returns one that was built, deployed, exercised, merged with earned authority, and watched in production - on your own hardware, with a cost you saw before it started.

The model is not the product.

Frontier models move quality more than any harness does, so Ship does not compete on being the smartest loop. It competes on everything around it.

It is a control plane.

Intake policy, spend governance, sandboxing, evidence, audit, and merge authority - the parts a team needs before an agent touches a real repo.

Self-hosted first.

For the teams that cannot send source to someone else's cloud. The native loop needs nothing but a shell, so air-gapped is a configuration.
Evidence

Seven rungs. Authority is earned from the ones that ran.

Each repository declares which rungs apply. Ship runs them after the agent stops and records every outcome verbatim. A rung that did not run is listed with its reason, never omitted - and a skipped required rung holds the merge.

Change class

Docs and comments only. No rung is needed to earn auto-merge; the diff is published as is.Every declared rung must pass. Auto-merge is per repo and off until you turn it on.Large or sensitive diffs park on a person whatever the rungs say. The rungs still run; they inform the review.

The preview and observe rungs use the teploy CLI and Observe. Without them Ship still runs baseline, build, and tests; with them it closes a loop no standalone agent can.

baselinenot neededrequiredheld for review

The suite before the agent touched anything, so a red test is attributed to the change and not to the repo.

buildnot neededrequiredheld for review

The branch builds into a real image with the teploy CLI. Not a claim that it compiles; an artifact with a digest.

testsnot neededrequiredheld for review

The repository's own test command, run by Ship after the agent stops. The result is recorded verbatim.

previewnot neededrequiredheld for review

The branch image deployed to a preview URL and smoke-tested. Deploy and smoke are one rung; a preview that serves nothing is a failure.

visualnot neededrequiredheld for review

A screenshot diff of the preview against the baseline, when the project declares one.

flownot neededrequiredheld for review

An agent-written browser flow driven against the preview, exercising what the change was for.

observenot neededrequiredheld for review

A post-merge window of error rate and latency read from Observe. A regression rolls back and reopens the work.

Control plane

Governance for autonomous work

The controls an operator needs before letting an agent near production repos. Built in, not bolted on.

01

Intake policy per source

Each source resolves to ignore, propose, or auto. Unknown means propose; a typo never widens authority.

02

Spend that cannot fail open

A daily cap enforced at enqueue and a hard per-run ceiling. Unrecognised hosted models are priced at the highest known rate.

03

Admission control

Task text is screened for prompt injection before a run exists. A stranger's note becomes a proposal, never a run.

04

Secrets scoped and redacted

Runs receive only the credentials they need, by name. Values never reach the log. Key material in a diff is refused.

05

Sandbox, default-deny egress

One container per run, no outbound network unless the project allows a host. Timeouts enforced inside the container.

06

Blast-radius caps

A diff that touches too many files is refused at the publish gate. Oversized changes raise drafts, not surprises.

07

Roles and SSO

Admin, editor, and viewer on the dashboard. Approving and steering are grants. OIDC sign-in is built in.

08

A complete run record

Runs are event-sourced: every step, decision, cost, and rung is recorded and replayable. The audit trail is the execution log.

Durable runs

Parks on a decision. Resumes days later. Nothing re-runs.

Runs are workflows over an event log. A run parks on a plan review, an approval, a merge boundary, or a question the agent chose to ask - and while parked it holds zero processes. Answer from the dashboard, the CLI, the API, or an approvals queue; replay skips every completed step.

  • steeradd instructions to a run in flight instead of killing it
  • askthe agent can stop and ask; an empty answer tells it to decide
  • retrya failed rung re-runs the agent against the failure, bounded
  • recoverstuck-run detection is on by default; a loop is stopped, not discovered
Your model, your harness

Ship holds no model and is not married to its own loop

Point it at any endpoint that speaks the Anthropic or OpenAI wire format - directly, through your own gateway, or at a local runtime. Then choose what edits the tree. Whichever harness runs, intake, approvals, the publish gate, the evidence rungs, spend, and audit stay Ship's.

Route through the gateway. Provider keys stay in teploy-gateway; Ship never sees them.

Local models cost zero. ollama, vllm, llama.cpp are priced at nothing; flat-rate plans are counted, not priced.

Measured, not claimed. Benchmark results are published with the model named and the interval, in MODELS.md.

Ship's own CodeAct loop

The agent acts by writing bash or Python and reading real output, one block per turn. It needs nothing in the sandbox image but a shell, which makes it the air-gapped option and the measured baseline every adapter is compared against.

SHIP_HARNESS=native

Claude Code, headless

Runs claude -p inside the sandbox with forwarded credentials. Its event stream is read live into the Now card as it arrives. Its result is a working tree and a claim, which Ship records and then verifies like any other.

SHIP_HARNESS=claude-code

OpenCode, headless

The same seam: one recorded preflight for the binary and its version, one recorded run. A missing binary is a recorded error, not a silent fallback. The harness is chosen per project or per run.

SHIP_HARNESS=opencode

$4.08

of a $4.00 ceiling. The run halted.

That is the whole feature. Every run has a cap you set before it starts, a cost that is visible while it runs, and a ledger entry when it stops. The daily cap is checked at enqueue, so a busy morning cannot spend the afternoon.

Ways in

Work arrives from where it already lives

GitHub, ForgejoSigned issue webhooks. A label turns an issue into a proposed task.
CI failureA failed pipeline proposes its own fix, deduplicated per failure.
Slack, LinearMessages and tickets join the same intake queue under their own policy.
CLI and APIteploy-ship enqueue from a terminal, or POST /api/runs from anything.
Scan modeA read-only run that reports findings with file, line, severity, and fix. No branch, no PR.
Work itemsMilestones planned in Akiroo dispatch to Ship and read the outcome back, rungs included.
Operate

One dashboard, one worker, one store

RunsThe Now card: phase, elapsed, the last tool call, how long this repo typically takes.
ProjectsPer-repo test command, preview app, harness, observe window, merge authority, scoreboard.
Inbox, SourcesProposed tasks waiting for a person. Per-source policy and budget.
SpendToday against the daily cap, by source, repo, and model.
ReviewsRuns parked on an approval, a merge boundary, or a question the agent asked.
FleetWorkers, heartbeats, queue depth, stuck-run detection - emitted to your telemetry too.

The stack idles around 200 MB. A second box joins with teploy-ship join, which verifies the controller, store, sandbox pool, forge, and model route and starts nothing unless all of them answered. What one worker carries is measured under load, not projected.

Comparison

Where Ship stands

Not the smartest agent, and not trying to be. These are the rows that decide whether you can run it at all, what it costs, and what a merge means.

ShipDevinVorfluxOpenHands
Runs on your servers, air-gap capableYesCloudCloudYes
Durable runs that park and resumeYes, event-sourcedNoKeeps a VM warmNo
Bring your own model, no markupAny Anthropic- or OpenAI-wire endpointNoBYOKYes
Per-run cost visible, hard capEnforced at enqueueOpaque creditsTokens plus computePartial
Deploys the preview itselfYes, via the teploy CLINoNoNo
Post-merge telemetry watch with rollbackYes, via ObserveNoNoNo
Merge authority earned from evidencePer repo, off by defaultPR onlyThreshold auto-mergePR only
The agent can ask and waitParks the runSide chatNoNo

Sub-agent fleets and browser task capture are deliberately absent. Ship does not have them and is not building them.

Issues in. Proof out.

One install brings up the dashboard, the worker, and the store. The quickstart gets you to a pull request that carries its own test result in about ten minutes.