CI runnersAgent machinesone microVM fleet

Cut CI cost.Give every agent its own machine.

Bowse puts your GitHub Actions jobs and your AI agents on one fleet of isolated Linux microVMs. A CI job borrows a fresh machine and hands it back. An agent gets one to keep — shell, browser, desktop, and a disk that remembers.

Prefer reading first? Open the docs outline.

[ci] Swap one label — each job lands on a fresh microVM

~/.github/workflows/test.ymlOne-line change
name: teston: [push, pull_request]jobs:  test:    runs-on: ubuntu-latest    runs-on: bowse    timeout-minutes: 20    steps:      - uses: actions/checkout@v4      - uses: actions/setup-node@v4        with: { node-version: 22, cache: npm }      - run: npm ci && npm test
Runner label
2 vCPU · 8 GB · $0.0012/min preview

[agent] Boot a machine — create, exec, browse

machine://adaidle
  1. 01createqueued
    bowse machine create ada --size 4x16 --keep-disk

    ada is running · 4 vCPU · 16 GB · disk kept on stop

  2. 02execqueued
    bowse machine exec ada -- pnpm test

    ✓ 214 passed · exit 0

  3. 03browserqueued
    chromium.connect_over_cdp(ada.browser().url)

    CDP attached · 1 page open

Simulated in your browser — no machine is started.

Agent machines

Hand the agent a whole computer, not a code cell.

Function sandboxes are fine for a quick eval. Real agent work — cloning a repo, signing into a dashboard, leaving a dev server up for review — needs a machine with a filesystem that’s still there tomorrow.

ada — shellLive
$ bowse machine create ada --size 2x8✓ ada is running · 2 vCPU · 8 GB$ bowse machine ssh adaagent@ada:~$ git clone https://github.com/northwind/web && cd webCloning into 'web'... done.agent@ada:~/web$ sudo apt-get install -y ripgrep✓ ripgrep installedagent@ada:~/web$ pnpm test✓ 96 passed · 3 skippedagent@ada:~/web$ 
Shell rides an authenticated HTTPS session — no SSH keys to rotate, no port 22 to open.

01 / 05 · Shell

A real shell, with sudo, that nobody else shares.

Attach from the console or your own terminal. Whatever the agent installs stays inside its machine — none of it lands on your laptop or your servers.

  • Ubuntu userland, root inside the machine
  • Docker runs inside, too
  • Every command keeps its exit code
bowse machine ssh ada

Four handles, one machine

Boot it from Python, TypeScript, the CLI, or an MCP client.

Your orchestration code gets typed SDKs. Agents that speak MCP can create, run, and stop machines on their own — with only the scopes you grant.

Everything a machine can do
# pip install bowse
from bowse import Machine

ada = Machine.create(name="ada", size="2x8", keep_disk=True)

ada.run("git clone https://github.com/northwind/web")
result = ada.run("cd web && pnpm test")
print(result.exit_code, result.stdout[-200:])

ada.stop()  # compute stops; the disk stays
Preview API — package names, commands, and the MCP endpoint are placeholders. Nothing is published yet.

CI runners

Keep the workflow file. Change who runs it.

Bowse acts as a self-hosted runner pool for the repositories you choose. Jobs that ask for runs-on: bowse land on a clean microVM; every other job keeps running wherever it runs today.

  1. 01

    Connect the GitHub App

    Pick the repositories Bowse may see. Nothing runs on Bowse until a job asks for it.

  2. 02

    Swap one label

    Change ubuntu-latest to bowse, or a sized label such as bowse-4x16.

  3. 03

    Push like always

    Checks, logs, annotations, and re-runs stay in GitHub. Bowse only supplies the machine.

  • Docker Engine, Buildx, Compose
  • actions/cache compatible
  • BuildKit type=gha layers
  • Ubuntu 24.04 · x64
  • One job per machine
How Bowse CI works
northwind/web · pull request #42 · checksGitHub
- runs-on: ubuntu-latest
+ runs-on: bowse
  • lintbowse-1x2
  • test (node 22)bowse-2x8
  • test (node 24)bowse-2x8
  • docker buildbowse-4x16
All checks passed. Logs, annotations, and re-runs stay in GitHub.
test.yml · warm caches, cold machines
steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-node@v4
    with:
      node-version: 22
      cache: npm          # no change needed
  - run: npm ci && npm test
  - uses: docker/setup-buildx-action@v3
  - uses: docker/build-push-action@v6
    with:
      cache-from: type=gha
      cache-to: type=gha,mode=max
Cache quotas and retention will be published with pricing.

Cost clarityPreview

Check the math against your own invoice.

Savings headlines age badly. Type in what you pay per minute today and how much CI you run, and compare it with Bowse’s preview rates — no competitor price list required.

CI runtime estimate

Preview rates
Bowse runner size

20,000 runtime minutes / month

  • Your current runner

    at $0.0080/min

    $160.00

  • Bowse preview

    bowse-2x8 · $0.0012/min

    $24.00

Difference at preview rates: $136.00 / month

20,000 min × $0.0012

Placeholder figures for interface preview. Bowse Inc. has not published list prices. The estimate assumes identical runtime on both machines and leaves out free allowances, storage, discounts, and tax. Bowse runtime will include machine preparation and cleanup.

Isolation

Every workload boots its own kernel.

Tenants never share a container runtime. Each CI job and each agent machine is a KVM microVM with its own guest kernel, and access is scoped to the workspace that created it.

  • One microVM per CI job

    A runner serves exactly one job. When it finishes, the machine and its disk are destroyed.

  • Workspace-scoped keys

    API keys and roles belong to a single workspace. MCP clients sign in with OAuth and ask for scopes.

  • Just-in-time runner tokens

    Runner registrations are minted per job and are useless once that job is done.

  • Network off switch

    Create a machine with outbound internet disabled when the code inside isn’t yours.

Read the security model

Bowse host

CI job

ci-job 48121

workloadguest userlandown guest kernel

wiped on exit

Agent machine

ada

workloadguest userlandown guest kernel

disk kept on stop

Agent machine

lin

workloadguest userlandown guest kernel

outbound network off

KVM hypervisor boundary · no shared guest kernel
Illustration of the isolation model. Workload names are examples.

SizesPreview

Six machine shapes, named by what’s inside.

Labels read as vCPU × GB of RAM, so a workflow file tells you what it runs on. CI jobs and agent machines share the same six shapes.

Machine size
Label
bowse-2x8
Root disk
48 GB
Per minute preview
$0.0012
Per hour preview
$0.072
Good for
Typical app CI; what plain runs-on: bowse gets
Use it
# GitHub Actions
runs-on: bowse-2x8

# Agent machine (preview SDK)
Machine.create(size="2x8")

Start with one workflow and one agent.

Point a single job at runs-on: bowse and give one agent a machine of its own. Questions go straight to support@bowse.dev.