<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[BoxLite]]></title><description><![CDATA[BoxLite]]></description><link>https://blog.boxlite.ai</link><image><url>https://cdn.hashnode.com/uploads/logos/6992be66ab9db2315003dc3b/836faf30-c1a4-4faa-8f89-4edf0c9b0353.png</url><title>BoxLite</title><link>https://blog.boxlite.ai</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 05:29:31 GMT</lastBuildDate><atom:link href="https://blog.boxlite.ai/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><atom:link rel="first" href="https://blog.boxlite.ai/rss.xml"/><item><title><![CDATA[Building a VMM from scratch, #0: Why BoxLite is replacing libkrun]]></title><description><![CDATA[<p>Every BoxLite box runs in its own micro-VM, and today libkrun runs that VM. We're replacing it with a VMM we write ourselves. This series builds it in public, one merged PR at a time.</p>
<h2>1. What BoxLite is</h2>
<p>BoxLite is the compute substrate for AI agents  light enough to embed on your laptop, elastic enough to power an agentic cloud. Each box is a hardware-isolated micro-VM that runs any OCI image and keeps its state across turns.</p>
<p><img src="https://cdn.hashnode.com/uploads/gql/6992be66ab9db2315003dc3b/cf7477c1-721e-4dd9-b2d7-d7ee8ebb761f.png" alt="BoxLite architecture on your machine and in the cloud" /></p>
<p><em>Figure 1. One engine in two places: the embedded BoxLite runtime starts one micro-VM per box, on your machine or on a cloud runner.</em></p>
<p>The part that runs each micro-VM is the VMM, the virtual machine monitor. That part is the subject of this series.</p>
<h2>2. Why we started on libkrun</h2>
<p>libkrun describes itself as "a dynamic library that allows programs to easily acquire the ability to run processes in a partially isolated environment", on KVM (Linux) and HVF (macOS on Apple silicon), behind "a simple C API". That fit BoxLite:</p>
<ul>
<li>A library, not a daemon: BoxLite embeds in your app, with no root and no background service.</li>
<li>One API for KVM on Linux and Hypervisor.framework on macOS.</li>
<li>The guest kernel comes with it (libkrunfw), along with virtio-fs, virtio-blk and vsock.</li>
</ul>
<p>libkrun is how BoxLite runs boxes on macOS and Linux today.</p>
<h2>3. Why we're replacing it</h2>
<p>libkrun is clear about what it isn't: its <a href="https://github.com/containers/libkrun#readme">README</a> lists "Become a generic VMM" and "Be compatible with all kinds of workloads" as non-goals. BoxLite's needs grew past those goals:</p>
<ul>
<li><strong>The VM's outcome.</strong> libkrun ends the process itself, so the caller gets no exit status, and every start failure comes back as <code>-EINVAL</code>.</li>
<li><strong>The kernel as a shared library.</strong> libkrunfw is loaded with <code>dlopen</code>, and that keeps breaking on some hosts; <a href="https://github.com/boxlite-ai/boxlite/issues/1512">#1512</a> lists six such issues.</li>
<li><strong>Devices.</strong> Each directory volume gets its own device, and with three a box fails to start with <code>IrqsExhausted</code> (<a href="https://github.com/boxlite-ai/boxlite/issues/935">#935</a>).</li>
<li><strong>What comes next.</strong> Hot-plug mounts, live resizing, memory snapshots for AutoPause (<a href="https://github.com/boxlite-ai/boxlite/issues/1003">#1003</a>) and GPUs all need a VMM we control.</li>
</ul>
<h3>What we're not doing</h3>
<ul>
<li>Forking or patching libkrun. It ships unchanged until the new VMM is the default, stays one release as a fallback, and is then removed.</li>
<li>Building a general-purpose VMM. It runs one VM per process with BoxLite's devices only; confidential computing, live migration and Intel Macs are out of scope.</li>
</ul>
<h3>What it costs</h3>
<ul>
<li>The new VMM needs macOS 15 or later, for Hypervisor.framework's in-kernel interrupt controller. macOS 1214 keep libkrun until cutover.</li>
<li>A long road: first boot (M1), then a real box (M2), volumes (M3), hardening (M4) and cutover (M5).</li>
</ul>
<h2>4. How a VMM works, in one screen</h2>
<p><img src="https://cdn.hashnode.com/uploads/gql/6992be66ab9db2315003dc3b/9d36c560-9bd9-48c3-b79c-d562355f2dd8.png" alt="Inside one machine: host process, jailed boxlite-shim, micro-VM and state" /></p>
<p><em>Figure 2. Inside one machine. The runtime spawns a jailed boxlite-shim per box, and the VMM inside it runs the micro-VM. PROPOSED marks what this series replaces.</em></p>
<p>A hypervisor (KVM or Hypervisor.framework) runs guest instructions on the CPU. The VMM is the ordinary process around it: it gives the guest memory, creates vCPUs, loads the kernel and emulates every device. Its heart is one loop:</p>
<p><img src="https://cdn.hashnode.com/uploads/gql/6992be66ab9db2315003dc3b/a5a85a17-51b6-44ab-8a1e-1508040351d7.png" alt="The VMM loop: run a vCPU, handle its exit, run it again" /></p>
<p><em>Figure 3. Run a vCPU until it exits, handle the exit, and run it again.</em></p>
<p>The first guest our new KVM backend ran was 7 bytes long:</p>
<pre><code class="language-nasm">mov dx, 0x3f8   ; COM1 serial port
mov al, 'K'
out dx, al      ; KVM exits to the VMM: port 0x3f8, byte 'K'
hlt
</code></pre>
<p>Everything else is detail, and each detail gets a part in this series:</p>
<table>
<thead>
<tr>
<th>Piece</th>
<th>What it is</th>
<th>Part</th>
</tr>
</thead>
<tbody><tr>
<td>Memory</td>
<td>Guest RAM is host memory; an unmapped address is a device</td>
<td>#1</td>
</tr>
<tr>
<td>Exits</td>
<td>One exit contract for KVM, Hypervisor.framework and, later, WHP</td>
<td>#2</td>
</tr>
<tr>
<td>Stopping</td>
<td>Pulling a vCPU out of the guest, safely</td>
<td>#3</td>
</tr>
<tr>
<td>CPU state</td>
<td>Registers, CPUID and MSRs on x86</td>
<td>#4</td>
</tr>
<tr>
<td>Boot</td>
<td>The VMM is the bootloader</td>
<td>#6</td>
</tr>
<tr>
<td>Devices</td>
<td>Serial, RTC and reset first, then virtio</td>
<td>#7, #1012</td>
</tr>
</tbody></table>
<h2>5. The series</h2>
<p>Status as of October 11, 2026. A part goes out only after its code merges, so every claim links to a merged PR.</p>
<table>
<thead>
<tr>
<th>Arc</th>
<th>Parts</th>
<th>Ships when</th>
</tr>
</thead>
<tbody><tr>
<td>1. First instructions</td>
<td>#1 Your first VM is 7 bytes  #2 Design the exit contract first  #3 Stopping a vCPU is the hard part  #4 x86 CPU state, by hand  #5 A kernel we build ourselves</td>
<td>Code merged</td>
</tr>
<tr>
<td>2. First boot (M1)</td>
<td>#6 You are the bootloader  #7 Boring devices first  #8 On Apple silicon, you decode the exits  #9 One kernel, three hosts</td>
<td>As M1 lands</td>
</tr>
<tr>
<td>3. First box (M2M3)</td>
<td>#10 virtio from scratch  #11 Disks, sockets, network  #12 One virtio-fs device for every volume  #13 Our agent as PID 1</td>
<td>M2M3</td>
</tr>
<tr>
<td>4. Ship it (M4M5)</td>
<td>#14 Guest input must never panic the host  #15 Measured against libkrun  #16 Deleting libkrun</td>
<td>M4M5</td>
</tr>
<tr>
<td>Later</td>
<td>Memory snapshots, hot-plug mounts, GPUs, our own network stack</td>
<td>After M5</td>
</tr>
</tbody></table>
<h3>Where we are</h3>
<ul>
<li> Design and one hypervisor contract for KVM, Hypervisor.framework and, later, Windows</li>
<li> KVM on x86_64: VMs, memory, the run loop, I/O completion, kicks, boot registers, CPUID and MSRs</li>
<li> A reproducible build of our pinned Linux 6.12 kernel for x86_64</li>
<li> M1: first boot on macOS arm64, Linux x86_64 and Linux arm64, checked in CI</li>
</ul>
<p>Follow along on the <a href="https://blog.boxlite.ai/rss.xml">RSS feed</a> and in every PR on <a href="https://github.com/boxlite-ai/boxlite">GitHub</a>.</p>
<h2>6. Come build it with us</h2>
<p>BoxLite is open source, and so is every step of this VMM. We'd love your help:</p>
<ul>
<li><strong>Challenge the design.</strong> Read the <a href="https://github.com/boxlite-ai/boxlite/blob/main/docs/contributing/architecture/vmm/README.md">VMM design doc</a> and tell us where it's wrong.</li>
<li><strong>Pick up M1 work.</strong> <a href="https://github.com/boxlite-ai/boxlite/issues/1698">#1698</a> lists the open slices and their dependencies: devices, kernel loaders, the Hypervisor.framework backend, arm64 KVM and three-host CI.</li>
<li><strong>Ask and discuss.</strong> Open a <a href="https://github.com/boxlite-ai/boxlite/issues">GitHub issue</a> or find us on <a href="https://go.boxlite.ai/discord">Discord</a>.</li>
</ul>
<p>Start with <a href="https://github.com/boxlite-ai/boxlite/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a>. Your first PR asks you to sign our contributor license agreement.</p>
]]></description><link>https://blog.boxlite.ai/building-a-vmm-from-scratch-0-why-boxlite-is-replacing-libkrun</link><guid isPermaLink="true">https://blog.boxlite.ai/building-a-vmm-from-scratch-0-why-boxlite-is-replacing-libkrun</guid><category><![CDATA[virtualization]]></category><category><![CDATA[microvm]]></category><category><![CDATA[Rust]]></category><dc:creator><![CDATA[Dorian Zheng]]></dc:creator></item><item><title><![CDATA[BoxLite ranks #1 of 10 AI sandboxes on HVTracker's trust score]]></title><description><![CDATA[<p>On October 3, 2026, BoxLite ranked first of the ten projects in HVTracker's Sandboxes &amp; Runtimes category, with an HVTrust score of 85.6. It was the only sandbox with an A grade, ahead of E2B (78.2) and NVIDIA's OpenShell (73.6).</p>
<p><img src="https://cdn.hashnode.com/uploads/gql/6a8eeff6181e560408d6d1c1/eb723900-f287-486b-8e35-185be25d0a9f.png" alt="HVTracker's Sandboxes &amp; Runtimes leaderboard on October 3, 2026: BoxLite first with 85.6 and an A grade, then E2B at 78.2, OpenShell at 73.6, OpenSandbox at 71.5 and Cube Sandbox at 71.1" /></p>
<p><em>Source: <a href="https://hvtracker.net/?cat=Sandboxes+%26+Runtimes">hvtracker.net, Sandboxes &amp; Runtimes</a>, updated 2026-10-03 12:10 UTC.</em></p>
<h2>What the score measures</h2>
<p><a href="https://hvtracker.net">HVTracker</a> scores open-source AI agent projects on public, checkable signals, and doesn't take vendor claims into account. HVTrust is weighted toward the signals that are hardest to fake: build provenance, signed commits and the OSSF Scorecard. Maintenance and adoption make up the rest.</p>
<p>In other words, it answers one question about a sandbox: <strong>can you trust the package you install?</strong> That matters more for a sandbox than for most software. A sandbox is the one thing you install specifically to run code you don't trust, and if the package itself is compromised, the isolation it promises doesn't matter. It's usually easier to poison a release than to break a hypervisor.</p>
<table>
<thead>
<tr>
<th>Rank</th>
<th>Project</th>
<th>HVTrust</th>
<th>Grade</th>
<th>Build provenance</th>
<th>Signed commits</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>BoxLite</td>
<td>85.6</td>
<td>A</td>
<td>npm and PyPI</td>
<td>100%</td>
</tr>
<tr>
<td>2</td>
<td>E2B</td>
<td>78.2</td>
<td>B</td>
<td>none</td>
<td>81%</td>
</tr>
<tr>
<td>3</td>
<td>OpenShell</td>
<td>73.6</td>
<td>B</td>
<td>none</td>
<td>100%</td>
</tr>
<tr>
<td>4</td>
<td>OpenSandbox</td>
<td>71.5</td>
<td>B</td>
<td>none</td>
<td>7%</td>
</tr>
<tr>
<td>5</td>
<td>Cube Sandbox</td>
<td>71.1</td>
<td>B</td>
<td>none</td>
<td>79%</td>
</tr>
</tbody></table>
<p>The other five scored below 60. Scores are recomputed daily, so these will move.</p>
<h2>Why BoxLite is first</h2>
<p>The gap comes from one signal: <strong>BoxLite is the only one of the ten that publishes build provenance.</strong> Our npm and PyPI releases carry a signed attestation that links each package to the commit and the CI run that built it, and both registries point back to the repository HVTracker tracks. That earns the full 18 points for identity. Every other sandbox in the category scored 10.8.</p>
<p>It isn't popularity. E2B has six times our GitHub stars and about sixty times our weekly downloads, and adoption is 20% of the score. BoxLite still ranks higher, because the signals that are hardest to fake outweigh it.</p>
<h2>Where we lose points</h2>
<p>The score isn't perfect, and the breakdown is public. Our <a href="https://scorecard.dev/viewer/?uri=github.com/boxlite-ai/boxlite">OSSF Scorecard</a> is 5.2 out of 10, lower than E2B's 6.9 and OpenShell's 6.5. The checks pulling it down are ones we can fix: pinning CI dependencies by hash, scoping workflow token permissions, signing GitHub releases and adding fuzzing. We're working through them, and the score will show it.</p>
<h2>What a score can't tell you</h2>
<p>HVTrust is one input, not a verdict. It measures how a project is built and shipped. It doesn't measure whether the isolation boundary holds, and it can't see how you deploy it. When you evaluate a sandbox, ask both questions:</p>
<ul>
<li><strong>Does the boundary hold?</strong> Does each workload get its own kernel, or share the host's?</li>
<li><strong>Can you verify what you installed?</strong> Is every release traceable to its source and the build that produced it?</li>
</ul>
<p>HVTracker's data is a public answer to the second question. BoxLite's answer to the first has been the same since its first commit: every box is a real virtual machine with its own Linux kernel, isolated in hardware by KVM on Linux and Hypervisor.framework on macOS. A container shares the host kernel, so a container escape lands in the same kernel as everything else on the machine. Escaping a VM is a different class of attack.</p>
<h2>Try it</h2>
<p>BoxLite ships as an Apache 2.0 runtime you embed in your own program, with no daemon and no control plane, and as <a href="https://boxlite.ai">BoxLite Cloud</a>, which runs the same boxes behind an API key. Both share one SDK.</p>
<pre><code class="language-bash">pip install boxlite
</code></pre>
<pre><code class="language-python">import asyncio
import boxlite

async def main():
    async with boxlite.SimpleBox(image="python:slim") as box:
        result = await box.exec("python", "-c", "print(2 + 2)")
        print(result.stdout)  # "4"

asyncio.run(main())
</code></pre>
<ul>
<li>Source: <a href="https://github.com/boxlite-ai/boxlite">https://github.com/boxlite-ai/boxlite</a></li>
<li>HVTracker profile: <a href="https://hvtracker.net/agents/boxlite/">https://hvtracker.net/agents/boxlite/</a></li>
<li>Questions: <a href="https://go.boxlite.ai/discord">Discord</a>, or <a href="mailto:support@boxlite.ai">support@boxlite.ai</a></li>
</ul>
]]></description><link>https://blog.boxlite.ai/boxlite-ranks-first-hvtracker-ai-sandboxes</link><guid isPermaLink="true">https://blog.boxlite.ai/boxlite-ranks-first-hvtracker-ai-sandboxes</guid><category><![CDATA[ai agents]]></category><category><![CDATA[microvm]]></category><category><![CDATA[agent infra]]></category><dc:creator><![CDATA[Mandalore Wang]]></dc:creator></item><item><title><![CDATA[An embedded sandbox shouldn't need a Linux VM]]></title><description><![CDATA[<p>We started BoxLite with one conviction: a sandbox for AI agents should be a library you import, not a service you call.</p>
<p>BoxLite's first commit, on December 8, 2025, said it in the opening line of the README:</p>
<blockquote>
<p>BoxLite is an embeddable virtual machine runtime for secure, isolated execution environments.</p>
</blockquote>
<p>It took SQLite as its model ("small, fast, reliable") and defined the property in one line:</p>
<blockquote>
<p>Embeddable  No daemon, no root, just a library in your application.</p>
</blockquote>
<p>Ten months later, the design hasn't changed. Every box is a real virtual machine with its own Linux kernel, isolated in hardware: KVM on Linux, Hypervisor.framework on macOS. The VMM runs as a child of your process. There's nothing else to start.</p>
<p>On a Mac, that means BoxLite lives right on your Mac. There's no Linux VM to host the sandbox, no Docker Desktop and no background service. Your program starts a box, and when your program exits, the box is gone.</p>
<h2>What "embedded" means</h2>
<p>Postgres runs perfectly well on a single machine, and nobody calls it an embedded database. SQLite is embedded because it lives inside your program. There's no server to start, no port, and nothing to operate when your program isn't running.</p>
<p>We hold the embedded sandbox to the same bar:</p>
<ul>
<li><strong>It's a dependency, not a deployment.</strong> It goes in your lockfile, not your runbook.</li>
<li><strong>Nothing runs when nothing is running.</strong> There's no daemon, no control plane, no database and no reserved memory.</li>
<li><strong>It runs where your code runs.</strong> It works natively on macOS and Linux, with no VM to host the sandbox host.</li>
<li><strong>It's the same library everywhere.</strong> You use it in unit tests, in CI, in a desktop agent you ship to users, and on a customer's air-gapped server.</li>
</ul>
<p>Putting a sandbox platform on one machine makes it a smaller deployment, not an embedded one. The test is simple: when your program exits, is anything still running?</p>
<h2>Why it matters for agents</h2>
<p>Agents don't run in one place. They run on a developer's laptop, inside a test suite, in a CLI someone installed with <code>pip</code>, and inside products that ship to customers who will never run your infrastructure. A sandbox that needs its own servers can follow the agent to only some of those places. A library can follow it everywhere.</p>
<p>Isolation shouldn't be the price of that. Agent-generated code is untrusted code, and a shared-kernel container is a different risk class from a VM. BoxLite gives every box its own kernel, so embedding never means weakening the boundary.</p>
<h2>BoxLite and E2B Embed</h2>
<p>The term has spread this year. In September 2026, E2B launched <a href="https://e2b.dev/resources/introducing-e2b-embed">E2B Embed</a>, which in its own words "runs the whole E2B stack, every feature included, on a single machine." On that machine you run E2B's API, orchestrator, proxy, dashboard, Postgres, Redis, ClickHouse and a log pipeline. The machine has to be Linux with KVM, and on a Mac that means running it inside a Linux VM.</p>
<p>That's a useful product. It gives a customer a private copy of a hosted platform. By the test above, though, it's a single-node deployment rather than an embedded sandbox. The clearest way to show the difference is to measure it, so we installed both on the same MacBook Air (M4, 16 GB, macOS 26.1) and ran the same workload with 512 MiB sandboxes. Each was installed the way its own documentation describes for a Mac:</p>
<ul>
<li><strong>BoxLite:</strong> natively, with <code>pip install boxlite</code>.</li>
<li><strong>E2B Embed:</strong> in a Linux VM with nested virtualization, as its README requires on a Mac, using the default <code>docker compose up -d --wait</code>.</li>
</ul>
<table>
<thead>
<tr>
<th></th>
<th>BoxLite</th>
<th>E2B Embed</th>
</tr>
</thead>
<tbody><tr>
<td>What you install</td>
<td>a Python package</td>
<td>a Linux VM, Docker, and a 10-service stack</td>
</tr>
<tr>
<td>Install</td>
<td>8 s, 93 MB</td>
<td>~45 min (<code>compose up</code> alone: 166 s)</td>
</tr>
<tr>
<td>Zero to first sandbox</td>
<td>~15 s</td>
<td>~45 min</td>
</tr>
<tr>
<td>Running with no sandboxes</td>
<td>0 processes, 0 MB</td>
<td>10 services, 1.1 GB RAM, plus 4 GiB reserved</td>
</tr>
<tr>
<td>Disk after install</td>
<td>93 MB + images</td>
<td>~7.5 GB</td>
</tr>
<tr>
<td>Command round trip (p50 / p95)</td>
<td>1.0 / 1.3 ms</td>
<td>6.0 / 8.7 ms</td>
</tr>
<tr>
<td>Resume a stopped sandbox (p50 / p95)</td>
<td>175 / 178 ms</td>
<td>292 / 1,255 ms</td>
</tr>
<tr>
<td>Create to first command (p50)</td>
<td>1.1 s</td>
<td>117 ms</td>
</tr>
<tr>
<td>20 creates at once</td>
<td>20 of 20</td>
<td>8 of 20; the rest return <code>500</code></td>
</tr>
</tbody></table>
<p>The table follows from the two designs:</p>
<ul>
<li><strong>Fresh creates.</strong> E2B Embed creates a fresh sandbox faster, because its server restores each one from a snapshot of the template. That's what a server is good at.</li>
<li><strong>Admission control.</strong> The failed creates are by design: the node lets three sandboxes start at a time and asks the rest to retry.</li>
<li><strong>The cost of a server.</strong> Everything else in the table is what running a server costs you: the services, the reserved memory, and a network hop on every command.</li>
<li><strong>Nested virtualization.</strong> E2B ran under nested virtualization here, because that's how it runs on a Mac. On bare-metal Linux its numbers will be better.</li>
</ul>
<p>If you want your customer to run a copy of your cloud, E2B Embed does that. If you want the sandbox inside your product, that's what BoxLite was built for.</p>
<p>Each number is the median (p50) or 95th percentile (p95) of repeated runs: 30 creates, 100 commands and 20 resumes per tool. If you get different numbers, especially on bare-metal Linux, <a href="https://github.com/boxlite-ai/boxlite/issues">open an issue</a> and we'll update this post.</p>
<h2>Two forms, one runtime</h2>
<p>BoxLite ships in two forms that share one SDK and one core API:</p>
<ul>
<li><strong>BoxLite Open Source</strong> is the embedded runtime. It's Apache 2.0, runs in-process, needs no account, and no data leaves the machine.</li>
<li><strong><a href="https://boxlite.ai">BoxLite Cloud</a></strong> runs the same boxes as a hosted service, behind a REST URL and an API key.</li>
</ul>
<p>Moving between them is a change of endpoint, not a rewrite. When you need a server, we run it for you. You never have to start with one.</p>
<pre><code class="language-bash">pip install boxlite
</code></pre>
<pre><code class="language-python">import asyncio
import boxlite

async def main():
    async with boxlite.SimpleBox(image="python:slim") as box:
        result = await box.exec("python", "-c", "print(2 + 2)")
        print(result.stdout)  # "4"

asyncio.run(main())
</code></pre>
<ul>
<li>Source: <a href="https://github.com/boxlite-ai/boxlite">https://github.com/boxlite-ai/boxlite</a></li>
<li>Questions: <a href="https://go.boxlite.ai/discord">Discord</a>, or <a href="mailto:support@boxlite.ai">support@boxlite.ai</a></li>
</ul>
]]></description><link>https://blog.boxlite.ai/embedded-sandbox-no-linux-vm</link><guid isPermaLink="true">https://blog.boxlite.ai/embedded-sandbox-no-linux-vm</guid><category><![CDATA[ai agents]]></category><category><![CDATA[microvm]]></category><category><![CDATA[virtualization]]></category><dc:creator><![CDATA[Mandalore Wang]]></dc:creator></item><item><title><![CDATA[From one prompt to a playable game on BoxLite Cloud]]></title><description><![CDATA[<p>We asked a coding agent to build a mobile arcade game and publish it on BoxLite Cloud. The result was a playable shooter with touch controls, boss waves, and a leaderboard shared across players.</p>
<iframe src="https://www.youtube.com/embed/zUyp0toXppg" width="100%" height="420" style="width:100%;aspect-ratio:16/9;height:auto;border:0"></iframe>

<p><em>The video is a condensed edit. Build and deployment time varies with your configuration, network conditions, and app complexity.</em></p>
<p><a href="https://3000-d-467a62473953377950356f72.proxy.boxlite.ai">Play the game</a></p>
<h2>What is BoxLite Cloud?</h2>
<p><a href="https://boxlite.ai">BoxLite Cloud</a> is the managed cloud for AI agents. With a URL and an API key, your agent gets compute, a filesystem that survives restarts, and a public URL for what it buildsall within a hardware-isolated virtual machine.</p>
<p>You do not manage hosts, image caches, or capacity. Boxes start in about a second, stop when idle, and wake when accessed again.</p>
<p>Cloud uses the same boxlite package as the local runtime. To switch from local execution to Cloud, you change the runtime handle, not the client library.</p>
<h2>The prompt</h2>
<p>We gave the coding agent this request, with the spelling cleaned up here:</p>
<blockquote>
<p>Read <a href="https://boxlite.ai/agent.md">https://boxlite.ai/agent.md</a> first, then build a Strike 1945 mobile game with a cross-user scoring leaderboard and a working public URL.</p>
</blockquote>
<p>BoxLite Cloud credentials were already available in the agents environment. The linked guide gives the agent instructions for working with BoxLite Cloud.</p>
<h2>What happened next</h2>
<p>The agent read the 'agent.md' guide, built the game and score API, and deployed the app to a public BoxLite URL. It then checked the game in a browser, including mobile controls and scores submitted from separate sessions.</p>
<p>The run included debugging: browser testing caught a mission-start request bug, which the agent fixed. It also checked duplicate and invalid score submissions and reported that saved scores survived a server restart.</p>
<p>The coding agent handled implementation, testing, and deployment commands. BoxLite Cloud provided the environment where the app ran, the public URL, and the disk holding its score data. The leaderboard was shared server-side state, rather than a score saved only in one players browser.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6ab4b572e4dbf9628054e302/9cb8a4e0-beec-49c7-bba2-f28bb92a9b3c.svg" alt="A coding agent builds, tests, and deploys an app on BoxLite Cloud. Players access a public URL and share leaderboard data stored on the boxs persistent disk." /></p>
<p>This demo used one box. Its persistent disk is not a replicated database or a backup, and removing the box removes its data.</p>
<h2>Try your own idea</h2>
<p>Got your own idea? Tweak the prompt and <a href="https://boxlite.ai">Build on BoxLite Cloud</a> now. New accounts start with $100 in credits.</p>
]]></description><link>https://blog.boxlite.ai/from-one-prompt-to-a-playable-game-on-boxlite-cloud</link><guid isPermaLink="true">https://blog.boxlite.ai/from-one-prompt-to-a-playable-game-on-boxlite-cloud</guid><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Calvin Weng]]></dc:creator></item><item><title><![CDATA[Your agent built the app. Now put it online.]]></title><description><![CDATA[<p>Tags: ai-agents, microvm, managed-runtime</p>
<p><strong>Cover description:</strong> Build and deploy apps with one prompt to your coding agent.Let BoxLite Cloud handle the infrastructure. Start with $100 in free credits.</p>
<p>Youve been building with your coding agent. The app works on localhost. You want a friend to try it, but theres no link you can send.</p>
<p>So you switch from building features to figuring out hosting: where to run the app, how to start it, and how to make it reachable.</p>
<p>BoxLite Cloud gives your coding agent a managed environment to build and deploy apps, with a public URL you can share. Your agent handles the application setup and deployment; BoxLite manages the underlying infrastructure.</p>
<p>New accounts get <strong>$100 in free credits</strong>, added automatically. Use them to run your first app and keep improving it. <a href="https://boxlite.ai/#pricing">See pricing</a> for usage rates.</p>
<p><a href="https://boxlite.ai/?utm_source=blog&amp;utm_medium=owned&amp;utm_campaign=cloud_launch"><strong>Start building on BoxLite </strong></a></p>
<h2>Get your first app online</h2>
<p>You can try the suggested app in Quickstart or adapt the prompt to an idea of your own. Both use the same workflow: ask your coding agent to build the app, deploy it to BoxLite Cloud, and return a public URL.</p>
<h3>1. Copy the prompt into your coding agent</h3>
<p>Sign up, open Quickstart, and copy the starter prompt into your coding agent.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ab4b572e4dbf9628054e302/bb39d33a-486f-4dea-bff9-d377e76d84ee.png" alt="" style="display:block;margin:0 auto" />

<p>Use it as written to try the suggested app, or change the app description before sending it. Describe what you want to build, who its for, and the main thing it should do. You could turn the starter into a task board for your team, a small CRM, or a game with your own rules and design.</p>
<p>Keep the BoxLite instructions and credentials in place so your agent can deploy the app. For your first attempt, focus on one or two features you can test yourself. Then send the prompt and let your agent start building.</p>
<p>Quickstart creates your API key automatically. The preview hides it, but the copied prompt includes the full keytheres nothing to fill in manually.</p>
<p>Keep your agent open and respond if it asks for permission or needs more information.</p>
<h3>2. Open the URL and try the app</h3>
<p>Quickstart updates automatically when your app is online. Click <strong>Open app</strong>, then test its main feature. For a CRM, that might mean creating a contact and checking that it appears in the list.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ab4b572e4dbf9628054e302/d8bcb628-c4c1-491e-b3a7-42c64dc2a0e9.png" alt="" style="display:block;margin:0 auto" />

<p>A successful first deployment means the app is running on BoxLite Cloud, its public URL opens, and its main feature works. If something fails, give the error to your coding agent and ask it to fix it.</p>
<h2>You built it. Lets give it a try.</h2>
<p>That game you keep tweaking, a tool your team needed, or your very first appwed love to see what youve put online. It doesnt have to be polished; it just needs to work.</p>
<p><strong>Share your apps public URL on X and tag</strong> <a href="https://x.com/BoxliteAI"><strong>@BoxliteAI</strong></a>, or drop the link in <strong>#Show-Your-Agent</strong> on our <a href="https://go.boxlite.ai/discord">Discord</a>. Wed love to give it a try.</p>
<p>Found a bug along the way? Report it in <strong>#bugs</strong> on Discord with a few steps to reproduce it.</p>
<p>Once weve verified your working app on BoxLite Cloud or validated your bug report, well follow up and add <strong>another $100 in credits</strong> to your account so you can keep building. No form neededwell take it from there.</p>
<p>You can also explore the project on <a href="https://github.com/boxlite-ai/boxlite">GitHub</a> and join the conversation in <a href="https://github.com/boxlite-ai/boxlite/discussions">GitHub Discussions</a>.</p>
<h2>Build something today</h2>
<p>Dont leave your first app on the someday list. Your $100 in free credits is ready when you sign upput it to work today. Try the starter or describe your own idea, send the prompt, and get your first version online. You can keep improving it once someone has tried it.</p>
<p><a href="https://boxlite.ai/?utm_source=blog&amp;utm_medium=owned&amp;utm_campaign=cloud_launch"><strong>Start building today with $100 in free credits </strong></a></p>
]]></description><link>https://blog.boxlite.ai/your-agent-built-the-app-now-put-it-online</link><guid isPermaLink="true">https://blog.boxlite.ai/your-agent-built-the-app-now-put-it-online</guid><category><![CDATA[ai agents]]></category><category><![CDATA[agent infra]]></category><category><![CDATA[managed services]]></category><category><![CDATA[vibe coding]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Calvin Weng]]></dc:creator></item><item><title><![CDATA[BoxLite v0.10.0: Your agent needs more than a sandbox]]></title><description><![CDATA[<p>Tags: ai-agents, microvm, rust</p>
<p><strong>Cover description:</strong> BoxLite 0.10.0 gives agents a filesystem that outlives the box, an address the world can reach, and a ceiling that holds under concurrency.</p>
<p>That is one sentence. Look at what it demands.</p>
<p>The agent has to install a toolchain and keep it. It has to write files and still have them an hour later. It has to run a dev server that someone who is not the agent can open in a browser. And it has to do all of that inside limits, because "an agent that provisions compute" and "an agent that provisions compute you pay for" are the same sentence.</p>
<p>In 0.9.7 you could not do that through the API. In 0.10.0 you can. That is the release.</p>
<p>246 commits since 0.9.7, and the three largest areas of change are the API, the infrastructure, and the console  not the VM. The runtime was never the bottleneck. Everything an agent needs <em>around</em> the runtime was.</p>
<h2>One request, three new capabilities</h2>
<pre><code class="language-json">POST /v1/boxes
{
  "image": "python:3.11-slim",
  "volumes": [{ "managed_volume": "agent-home", "guest_path": "/workspace" }],
  "network": {
    "outbound": { "mode": "enabled", "allow_net": ["api.openai.com"] },
    "inbound":  { "mode": "enabled" }
  }
}
</code></pre>
<p>Three lines that were not possible over REST before this release: a managed volume attached by name, an egress allowlist that actually holds, and an inbound switch that makes the box's services publicly reachable.</p>
<h2>A filesystem that outlives the box</h2>
<p>Managed volumes existed in 0.9.x  if you were the internal box-creation path. Over REST they were unreachable, which meant every agent building on the public API rebuilt its world on every run.</p>
<p>Now:</p>
<ul>
<li><p><code>POST</code>, <code>GET</code>, <code>GET /:id</code>, <code>DELETE</code> on <code>/v1/volumes</code>  full lifecycle over REST</p>
</li>
<li><p>Volumes attach in the same call that creates the box</p>
</li>
<li><p>Addressed by <strong>id or name</strong>. <code>managed_volume: "agent-home"</code> and <code>managed_volume: "vol_01K2EXAMPLE"</code> both resolve</p>
</li>
<li><p>Single-file mounts, for when a directory is the wrong unit</p>
</li>
<li><p>S3-backed volumes through the same interface</p>
</li>
<li><p>A volumes console, and a rebuilt create-box dialog</p>
</li>
</ul>
<p>The <code>volume://</code> scheme is gone. It used to live inside a polymorphic <code>source</code> string, which is a parser nobody meant to write, and the CLI, the SDKs and the wire had all drifted on how to read it. <code>VolumeSpec</code> now carries <code>managed_volume</code> and <code>host_path</code> as separate typed fields. Two typed fields cannot disagree.</p>
<p>This is the half of stop-and-wake that makes it safe to use. A box that stops mid-run loses its disk. A volume does not, and the next box mounts it.</p>
<h2>An address the world can reach</h2>
<p>"Preview on a public URL" is a networking problem, and it landed here:</p>
<ul>
<li><p>Public box service traffic routes through the API, proxy, runner, and guest-port tunnel path</p>
</li>
<li><p>Box network tunnels are proxied through the API</p>
</li>
<li><p>Local TCP port publication with automatic or fixed host ports, surfaced through the box-info APIs across REST, CLI and SDKs</p>
</li>
<li><p>Tunnel listener forwarding  local TCP and Unix listeners on prepared tunnels, a fresh tunnel per accepted client, wire protocol unchanged</p>
</li>
</ul>
<p>Two constraints shipped with it, both on purpose. OCI <code>EXPOSE</code> is metadata, never an instruction that opens a host listener. Remote runtimes stay tunnel-first. Each published listener is bounded at 256 concurrent proxied connections.</p>
<p>And a fix that matters more than its size: a tunnel <code>CONNECT</code> against a stopped box used to drop the stream silently. It now rejects. Silent failure is the most expensive kind in an agent loop, because the agent will retry it forever.</p>
<h2>A ceiling that holds under concurrency</h2>
<p>Every platform ships quota. Most ship it checked on <code>create</code>, which is where it does the least good.</p>
<p>0.10.0 enforces per-organization ceilings  cpu, memory, disk, gpu, plus maximum concurrent boxes  on <strong>every path that adds or grows usage</strong>: create, start, warm-pool assignment, proxy auto-resume, and resize. Warm-pool assignment and auto-resume both add usage without anyone calling create. That is precisely how a "we have quotas" platform ends up with a runaway bill.</p>
<p>Underneath: a Redis pending-reservation using atomic Lua with TTL self-heal, checked against summed box-table usage. A projected total over a ceiling is rejected with a 400 before anything is allocated.</p>
<p>Metering grew up with it. Finalized box usage exports to the commerce service through an outbox, open allocations are snapshotted, and the console now binds Usage to the quota API, quotes box price from published usage rates, and confirms plan changes on a page that shows exactly what is queued.</p>
<p>If you are the person who signs off on an agent platform, this section is the one that matters.</p>
<h2>A tighter boundary</h2>
<p>Three holes in <code>allow_net</code> enforcement are closed. Each was a case where the policy applied in one direction but not another:</p>
<ul>
<li><p>UDP egress was not covered</p>
</li>
<li><p>The host alias IP was not covered</p>
</li>
<li><p>Host checks were bound to the requested destination, not the <strong>resolved</strong> one</p>
</li>
</ul>
<p>The third is the one to sit with. A hostname that passes the check and then resolves somewhere else was never checked at all.</p>
<p>All three are breaking changes, because traffic that used to escape no longer does. That is the correct direction, and it is worth reading carefully if you were relying on the gap without knowing it. We would rather tell you than let you find out.</p>
<p>Alongside: structured container capability controls, no capability mutation from privileged mode, host sandbox grants separated from guest networking, and a minimal guest rootfs to boot from.</p>
<h2>Errors that tell you what to do instead</h2>
<p>A small thing that says a lot about where the API is going. Send host port publication to the REST API and you no longer get <code>property ports should not exist</code>. You get:</p>
<blockquote>
<p>host port publication is local-only; use the box network tunnel endpoint to reach a guest service</p>
</blockquote>
<p>Four implementations of <code>CreateBoxRequest</code> had disagreed about which options a remote caller may set. One let a client switch the sandbox off. One refused nothing. Five fields were validated, audit-logged, and then silently dropped at the mapper. They are now either wired through or refused with a sentence that names the alternative.</p>
<h2>Upgrading</h2>
<p>0.10.0 earns the middle number. Before you bump:</p>
<ul>
<li><p><code>auto_pause</code> is now <code>auto_stop</code>, across the whole stack. The field never described a pause  the core has no pause operation, and the policy performs a real stop with no memory retention. The old name also collided with <code>BoxStatus::Paused</code>, which is the genuine SIGSTOP freeze taken during clone and export.</p>
</li>
<li><p><code>volume://</code> is removed from the wire. Use <code>managed_volume</code> or <code>host_path</code>.</p>
</li>
<li><p>The REST API rejects host-only box options instead of dropping them silently.</p>
</li>
<li><p><code>allow_net</code> now applies to UDP egress, the host alias IP, and resolved destinations.</p>
</li>
<li><p>The ssh-gateway is removed.</p>
</li>
<li><p>Box images move to the v0.1.0 line, relocated under <code>apps/</code>.</p>
</li>
<li><p>Tunnel half-close is owned by the core, which tolerates a hung-up peer.</p>
</li>
</ul>
<h2>Start here</h2>
<p>The open-source runtime and the managed Cloud share the same SDK call runs against a box on your laptop or a box on our fleet  a URL and an API key is the whole difference.</p>
<p>New accounts start with $100 for BoxLite Cloud in credits: <a href="https://app.boxlite.ai">https://app.boxlite.ai</a></p>
<p>Repo: <a href="https://github.com/boxlite-ai/boxlite">https://github.com/boxlite-ai/boxlite</a></p>
<p>Docs: <a href="https://docs.boxlite.ai">https://docs.boxlite.ai</a></p>
]]></description><link>https://blog.boxlite.ai/boxlite-v0-10-0-your-agent-needs-more-than-a-sandbox</link><guid isPermaLink="true">https://blog.boxlite.ai/boxlite-v0-10-0-your-agent-needs-more-than-a-sandbox</guid><dc:creator><![CDATA[Mandalore Wang]]></dc:creator></item><item><title><![CDATA[Idle is measured at the boundary, not inside the box]]></title><description><![CDATA[<p>A BoxLite Cloud box stops when it goes idle and wakes when something touches it. The part worth understanding before you design around it is what "touches" means: idle is measured at the box's boundary, not by what the box is doing. That single choice is what makes wake-on-access possible, and it is also the source of the two ways teams get surprised by it.</p>
<p>When you create a box in the console you set three switches: <code>Stop when idle</code>, <code>Wake on access</code>, and <code>Delete after stopping</code>. A stopped box wakes on SDK exec, file operations, or a terminal attach. So the agent's home comes back on demand instead of burning compute while nothing is asking it to work.</p>
<p>That is the pitch, and it holds. But the definition underneath it is narrower than most people assume.</p>
<h2>What counts as activity</h2>
<p>From the Cloud docs, verbatim:</p>
<blockquote>
<p>idle means no SDK, terminal, or preview traffic. Work running inside the box does not count, so a long job can be stopped mid-run.</p>
</blockquote>
<p>Read that twice. The idle timer is driven by traffic crossing into the box. A <code>for</code> loop pegging the CPU for forty minutes with nothing calling in is, as far as the lifecycle is concerned, silence.</p>
<p>This is not an oversight. It falls out of what wake-on-access requires. To wake a stopped box you have to be watching something that still exists while the box does not  an inbound request, a file operation, a terminal attach. You cannot watch a process inside a VM that is not running. Once the signal has to live at the boundary for wake to work, the same signal is the cheapest thing to reuse for stop. Symmetry, not laziness.</p>
<p>The cost of that symmetry is that internal work is invisible to the thing deciding whether you are done.</p>
<h2>Failure mode one: the long job that gets cut</h2>
<p>An agent that installs a toolchain, kicks off a build, and then waits is doing exactly the kind of work that looks like nothing from outside. If the idle window is shorter than the build, the box stops mid-run.</p>
<p>Two ways out, and they are not equivalent:</p>
<ul>
<li>Set the idle switches deliberately for that box. Long-running work is a per-box decision, not a global default.</li>
<li>Make a mid-run stop survivable instead of preventing it. Mount a managed volume and write progress to it. A box loses everything on its disk when it is destroyed; a volume does not, and another box can mount it later. A job that checkpoints is a job you are allowed to interrupt.</li>
</ul>
<p>The second is the more durable answer. Tuning a timeout to be longer than your longest job is a bet you will eventually lose.</p>
<h2>Failure mode two: treating it as a budget</h2>
<p>The billing docs are blunt about this one:</p>
<blockquote>
<p>Treat stop-when-idle as a safety net, not a budget. A busy box is never idle, so stop-when-idle will not cap what it spends.</p>
</blockquote>
<p>Idle-stop protects you from the box you forgot. It does nothing about the box that is genuinely in use, because that box is never idle by definition. If a runaway agent is hammering a box in a loop, every one of those calls is traffic, and traffic is the opposite of idle.</p>
<p>Pay-as-you-go is metered per hour across three dimensions: <code>$0.0504</code> per vCPU-hour, <code>$0.0144</code> per GiB-hour of memory, and <code>$0.00018</code> per GiB-hour of disk. The smallest box (1 vCPU, 1 GiB, 10 GiB) comes to <code>$0.0666</code> an hour. Those rates do not care why the box is up.</p>
<p>The habit the docs recommend is the unglamorous one: remove boxes when the work is done, as part of the task rather than as cleanup you plan to get to later.</p>
<h2>What this buys you</h2>
<p>The reason to accept a boundary-measured lifecycle is the second shape of box it enables. A disposable box for untrusted code does not need any of this; you create it, run, and remove it. But a persistent home for an agent does. It installs its tools once, writes files, stops, and picks the work back up later instead of rebuilding its world on every run.</p>
<p>Keeping that box up around the clock so it is warm when needed is the naive version, and you pay for every idle hour of it. Stop-and-wake gets you the same continuity without the standing bill, precisely because something at the boundary is still listening while the compute is not.</p>
<p>Design for it explicitly:</p>
<ul>
<li>Decide per box whether its work is externally driven or internally driven. Internally driven work needs the idle switches set, not defaulted.</li>
<li>Put anything you would hate to lose on a volume, not on the box disk.</li>
<li>Use idle-stop as a backstop for forgotten boxes. Use teardown as your cost control.</li>
</ul>
<p>The lifecycle is managed. Which things count as life is still your call.</p>
<p>Docs: <a href="https://docs.boxlite.ai/cloud">https://docs.boxlite.ai/cloud</a></p>
]]></description><link>https://blog.boxlite.ai/idle-is-measured-at-the-boundary-not-inside-the-box</link><guid isPermaLink="true">https://blog.boxlite.ai/idle-is-measured-at-the-boundary-not-inside-the-box</guid><category><![CDATA[ai agents]]></category><category><![CDATA[microvm]]></category><category><![CDATA[serverless]]></category><dc:creator><![CDATA[Mandalore Wang]]></dc:creator></item></channel></rss>