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.
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" }) },})Exactly this image.
No hidden base, no drift.
Secrets by purpose.
Protected keys stay outside the VM.
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.
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." }], }), ],})Start the agent you use.
init starts Pi once, before the first turn. Hibernation keeps it running.
Run it on each turn.
Each turn sends the next instruction to the same Pi session.
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.
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.
GET /repos/acme/app/pulls/482
Host: api.github.com
Authorization: Bearer hlmr_p_3f9c…e21aGET /repos/acme/app/pulls/482
Host: api.github.com
Authorization: Bearer ghp_••••••••••••POST /collect
Host: telemetry.example
Authorization: Bearer hlmr_p_3f9c…e21aScale 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 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
- ✓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 →