Run AI-written
code in a box.
Prompt in. Container up. Output streamed back. viberunner.org spins a secure, isolated container, hands it to an AI agent, and tears it down when the job is done. No setup. No cleanup. No SSH.
01POST/api/jobs02{ prompt: "build a markdown editor with03 live preview and word count" }0405202job_id: vr_8x4kq · queued06SSEevent: container.start07allocating ports, isolating filesystem...08SSEevent: claude.tool_use09Write src/App.tsx · 1.2KB10SSEevent: claude.tool_use11Write src/preview.ts · 612B12SSEevent: dev.ready13https://vr_8x4kq.viberunner.org14200job complete · 14.2s · $0.018>
Three steps. Zero ceremony.
You prompt.
Type what you want built — or upload code, or both. The job goes to the queue with a fresh job ID and a domain.
A container spins up.
A fresh, isolated Linux container boots in under a second, mounts a clean workspace, and hands control to the AI agent — running as an unprivileged user with no access to anything else.
You watch it ship.
Tool calls, file writes, server logs — streamed live over SSE. When the job ends, the box dies. Outputs stay.
Curl it. SDK it. Webhook it.
One endpoint to launch a job, one stream to watch it run, one bearer token to authenticate. The same REST API powers the web app — anything you can do in the dashboard, you can script.
# 1. Create a job
curl -X POST https://api.viberunner.org/v1/jobs \
-H "Authorization: Bearer $VIBERUN_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "prompt": "Build a markdown editor with live preview" }'
# → { "id": "vr_8x4kq", "status": "pending" }
# 2. Stream live logs over SSE
curl -N https://api.viberunner.org/v1/jobs/vr_8x4kq/stream \
-H "Authorization: Bearer $VIBERUN_API_KEY"import { Viberun } from "@viberun/sdk";
const vr = new Viberun({ apiKey: process.env.VIBERUN_API_KEY });
const job = await vr.jobs.create({
prompt: "Build a markdown editor with live preview",
});
for await (const ev of vr.jobs.stream(job.id)) {
if (ev.type === "stdout") process.stdout.write(ev.text);
if (ev.type === "done") console.log("done:", ev.status);
}from viberun import Viberun
vr = Viberun(api_key=os.environ["VIBERUN_API_KEY"])
job = vr.jobs.create(prompt="Build a markdown editor with live preview")
for ev in vr.jobs.stream(job.id):
if ev.type == "stdout": print(ev.text, end="")
if ev.type == "done": print("done:", ev.status)AI you don't have to babysit.
AI-written code is fast, useful, and occasionally reckless. viberunner runs it inside a security model designed to make recklessness boring. The agent can write what it wants — it just can't escape the container, hit your private network, or burn through your wallet.
Isolated containers
Every job runs in its own fresh Linux container. Filesystem, processes, and network are namespaced — no two jobs ever see each other.
Unprivileged execution
The AI agent never runs as root. It gets an ephemeral, unprivileged user with no access to the host or to your account credentials.
Disposable by default
When a job ends, the container dies with it. No leftover processes, no residual filesystem, no zombie state to clean up.
Network on a leash
Outbound calls go through a proxy that logs every request and can block anything outside an allowlist you control.
BYO model keys
LLM calls route through our proxy with per-key usage tracking. Bring your own provider keys, or use ours with hard spend caps.
Encrypted at rest
Prompts, code, and outputs are stored encrypted. Output files are scoped to the user who launched the job.
Pay for boxes, not for seats.
Free
- ▮10 jobs / day
- ▮Ephemeral sandboxes only
- ▮Shared queue
- ▮Community docs
Builder
- ▮Unlimited jobs
- ▮Permanent workspaces
- ▮Priority queue
- ▮Stream logs · 30d retention
Team
- ▮Dedicated pool UIDs
- ▮SSO + audit logs
- ▮Custom egress allowlist
- ▮Slack support
The model writes the code. The container runs it. You watch.
That's the whole product.
We don't replace your editor. We don't host your prod. We give Claude Code a clean Linux box, a network it can't escape, and a URL to ship its output to. Then we throw the box away.