Build cloud agents that work your way.

Your models, tools, and code. We handle the infrastructure.

Define an agent’s work in plain TypeScript and run it with the coding agent you already use. Helmr gives it a computer, keeps its work through hibernation and resume, and lets it work alongside your team.

Bring the agent you already use.

Helmr runs your agent as ordinary code on a computer you define. No new inference API, no rewrite into a framework’s abstractions.

DocsRunning a harness →
  • Claude Code
  • Codex
  • OpenCode
  • Pi
  • Cursor
  • AI SDK

Know exactly what your agent runs on.

The computer is defined in code: image, tools, resources, secrets and a prepare step. Nothing is configured behind a console, so what’s in the file is exactly what your agent gets — reviewable, versioned and the same for every session.

DocsComputers →
computer.ts
import { template, image } from "@helmr/sdk" export const workspace = template({  id: "app",  image: image("app")    .from("node:24-bookworm")    .run(["sh", "-c", "apt-get update && apt-get install -y ripgrep"]),  resources: { cpu: 2, memory: "4GiB" },   prepareSecrets: [{    secret: "REGISTRY_TOKEN",    env: { name: "REGISTRY_TOKEN", mode: "raw" },  }],  secrets: [{    secret: "ANTHROPIC_API_KEY",    env: {      name: "ANTHROPIC_API_KEY",      mode: "protected",      allowedOrigins: ["https://api.anthropic.com"],    },  }],   async prepare(build) {    await build.exec(["git", "clone", "https://github.com/acme/app", "/app"])    await build.exec(["npm", "ci"], { cwd: "/app" })  },})
  1. Exactly this image.

    No hidden base, no drift.

  2. Secrets by purpose.

    Protected keys stay outside the VM.

  3. Prepare it your way.

    Write any setup in prepare. Every new computer starts from the result.

Write agent work like a local script.

Start the coding agent you already use in init, then hand it each turn. Run it on a schedule or from a Slack thread. No workflow engine, and no rewriting your agent for someone else’s API.

DocsAgents →
agent.ts
import { agent, triggers } from "@helmr/sdk"import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent"import { workspace } from "./computer" export const coder = agent({  id: "coder",  template: workspace,   async init({ session }) {    const { session: pi } = await createAgentSession({      cwd: "/app",      sessionManager: SessionManager.continueRecent(        "/app",        `/var/lib/helmr/pi/${session.id}`,      ),    })    return pi  },   async turn(turn, { initResult: pi }) {    turn.onCancel(() => pi.abort())    await pi.prompt(turn.input.map(part => part.text).join(""))    await turn.respond(pi.getLastAssistantText() ?? "")    return { piSession: pi.sessionManager.getSessionId() }  },   triggers: [    triggers.cron("weekday-deps", "0 9 * * 1-5", {      timezone: "Asia/Tokyo",      input: [{ type: "text", text: "Update dependencies." }],    }),  ],})
  1. Start the agent you use.

    init starts Pi once, before the first turn. Hibernation keeps it running.

  2. Run it on each turn.

    Each turn sends the next instruction to the same Pi session.

  3. Run on a schedule.

    Each run starts a fresh session.

Part of your team. Right in Slack.

Agents join your Slack like colleagues, whatever they run on. Mention one to give it work; it asks teammates for context, hands parts of the job to other agents, and reports back in the thread.

DocsSlack →
  • triageOpenCode

    Flags three new checkout issues.

  • Mayateammate

    Hands the timeout to coder.

  • coderClaude Code

    Fixes it and asks for a review.

  • Kenteammate

    Decides to keep the 30s timeout.

  • reviewerCodex

    Reviews the change.

Durability you never think about.

There’s no checkpoint API, no state to serialize, no storage to manage. Memory, processes and files are saved outside the VM as your agent works, so it picks up where it left off, even on another machine, without repeating work or running init again.

DocsDurability →

vmTS

memory

processes

files

running your code

outside the vm

memory

processes

files

saved copy

another vmTS

memory

processes

files

picks up where it left off

Keep protected keys outside the agent.

Bind a secret as protected and the VM only ever holds a placeholder. Helmr swaps in the real value at the network boundary, only for origins you allow, and fails the request once the secret is revoked.

DocsSecrets →
inside the microVMGH_TOKEN
GET /repos/acme/app/pulls/482
Host: api.github.com
Authorization: Bearer hlmr_p_3f9c…e21a
api.github.comallowed
GET /repos/acme/app/pulls/482
Host: api.github.com
Authorization: Bearer ghp_••••••••••••
anywhere elseplaceholder only
POST /collect
Host: telemetry.example
Authorization: Bearer hlmr_p_3f9c…e21a

Scale on your own terms.

Helmr works out how many workers the queued work needs. Your scaler decides how to get them: which instances, which accounts, how fast and how far. Capacity grows with your organization under the policies you already run.

DocsCapacity scaling →

03:002 workers

11:00+1012 workers

19:00−75 workers

  • Capacity you control

    Set the fleet’s minimum and maximum size, and bound optional preparation on each worker.

  • Drain before removal

    A host leaves only after its work is saved or finished. If a host is lost, sessions resume elsewhere.

  • Limits per environment

    Cap resident computers, CPU, memory, storage and admission rate, so one workload cannot take the fleet.

Run it on your own network.

Helmr runs in your AWS account with no public endpoint. Your team reaches the Console, CLI and API over your company network, Slack connects outbound, and Helmr’s own traffic leaves only through a proxy you control. Agents stay off your internal network.

DocsPrivate deployment →
Your team

your AWS account · no public endpoint

  • Console, CLI, APIinternal load balancer
  • Control planesessions and audit
  • Workersagents in microVMs
  • GitHubsign-in and repositories
  • Slackoutbound connection

Enterprise-grade security, built in.

Control who and which agent can do what, down to a single agent. Every decision Helmr enforces is on record: who acted, what was checked, and what was refused, without your prompts or output ever entering the log.

SecurityHow it works →
  • PeopleConsole, CLI, Slack
  • Agentssessions and commands
  • API keysCI and scripts
  • Helmr itselfretention, recovery
one recordwho · what · why
  • ✓Role granted to Ops teamAiko · allowed by Access Administrator
  • ✓Command started on a computeragent demo-reporter · its own session
  • ✕Read session contentSato · refused, no role gives it here
  • ✓Deployment promotedkey ci-deploy · Deployer in Production

Open source. Infrastructure you control.

Early, open, Apache 2.0. Read the source before you trust it with your repositories, then run it where your work already lives.

DocsSelf-hosting →