Smol Machines × Monid

Give your agent a virtual machine.

A room of its own, with only the doors you open. It keeps working while the agent is away, keeps its files overnight, can be thrown away and remade in seconds. One of them, or three.

Give this to your agent
$set up https://monid.ai/SKILL.md, then use smolmachine

Smol Machines is the room: a hardware-isolated Linux microVM that boots in about four seconds.Monid is the one key your agent opens it with.Then ask for a machine. The API calls are free; the machine meters itself by the minute while it exists, so have the agent delete it when the job is done.

Boot to a locked room
4.3 s
Job kept running, agent away
45 s
Files after stop → start
intact
1,700+
Tools
7
Machines booted and deleted
41
API calls in the run
$0
Billed for those calls

Watch the run.

Thirty-four seconds. Five things a laptop cannot give an agent, each one done on a real machine behind this page.

01

A room with a locked door.

Your laptop has your keys, your files and your accounts on it. An agent's code is something you did not write, and it can be talked into anything. So it gets a room: one call boots a Linux microVM in 4.3 seconds, and the door opens only to the hosts you list. From inside, example.com does not even resolve. api.monid.ai, which was on the list, answers 200.

Two shapes to know: /machines requires resources and network in the body (the upstream defaults are 4 vCPU / 8 GB and an open door, so say what you want), and the allowlist is yours to set. Nothing is locked by default.

Say this
>use smolmachine on monid to create a python:3.12-alpine machine (resources 1 cpu, 512 MB, 1 GB; network mode allowCidrs with hosts pypi.org and api.monid.ai). then /exec `python3 -c "import urllib.request; print(urllib.request.urlopen('https://example.com', timeout=6).status)"` and show me the error, then exec the same one-liner for https://api.monid.ai/public/v1/stats and show me that it prints 200. keep the machine for the next step
Same machine, two requests
example.com
urlopen('https://example.com')
URLError
Name does not resolve
api.monid.ai
urlopen('https://api.monid.ai/public/v1/stats')
200
{"endpointCount":2163}
POST /machines · 201 · 4.3 s · run 01M3MFGQ4GEZ5YDPS3T7ATBFT6

image python:3.12-alpine · resources 1 vCPU, 512 MB, 1 GB · network allowCidrs: pypi.org, files.pythonhosted.org, api.monid.ai · ttl 30 min

the allowlist is a parameter you set; the upstream default is open

runs 01M3MFGVNV5ZX2VSYB8N4ZHSK8 · 01M3MFH3ZQCTWT9PBJ11VS9QGV · measured 2026-09-28

02

It keeps working while the agent is away.

A tool call is cut off after seconds. A laptop goes to sleep. This job ran for 45 seconds on /exec/async; the call handed it off in 0.76 seconds and the agent went and did eleven other things, including stopping and starting a second machine and reading its files back. It came back at 90 seconds and the result was waiting, nine timestamps and a finished.

Synchronous /exec is capped near 25 seconds because the answer rides on your own request. Anything longer goes to /exec/async, which returns a run id; poll GET /v1/runs/{id} when you want it, and read providerResponse.httpStatus as well as status: in our cold test one async fire came back COMPLETED with a 500 inside and a null output, and the same command succeeded on retry. Files under /workspace survive stop and start; /tmp does not. Stopping a machine ends whatever is running on it, which is why the file test happens on a second one.

Say this
>on that machine, start /machines/{id}/exec/async with command `for i in $(seq 1 9); do date +%T; echo step $i; sleep 5; done; echo finished` and timeoutSeconds 120, note the runId and move on: create a second identical machine, upload a small file to workspace/notes.md there (content_base64), /stop then /start that second machine, and cat /workspace/notes.md. only then GET /v1/runs/{runId} until it is terminal, check providerResponse.httpStatus is 200, and show me all nine timestamps. keep both machines for the next step
One job, one agent, ninety seconds
exec/async submitted, returned in 0.76 s
upload notes.md
create a second machine
append a line to notes.md
stop it
start it
cat notes.md · 3 lines, intact
break its python
the job finishes on its own
create a fresh machine
create three at once
collect the job: nine timestamps, finished

exec/async run 01M3MFH8PB6G9DMK3Z0PS0S7SZ · durationMs 45048 · collected at 90.3 s

03

Break it. Throw it away. Make three.

We deleted the machine's own json module. Python stopped importing it. That would have ended a day on a laptop; here the machine was deleted and a fresh one answered json ok 3.8 seconds later. Then three identical machines were created in one go, 4.4 seconds wall, and each reported its own hostname, the same image and the same size.

Every machine you make meters itself until you delete it, stopped or not (a stopped machine still bills its disk). Set a ttlSeconds as a safety net and /delete when the job is done. The agent in this run deleted all seven.

Say this
>on the second machine, /exec `rm -rf /usr/local/lib/python3.12/json && python3 -c "import json"` and show me the error. then /delete both machines, fire three /machines creates concurrently with the same body, /exec `hostname` on each, show me the three hostnames next to their machine ids, and delete all three
One broken, one fresh, three at once
$ rm -rf /usr/local/lib/python3.12/json && python3 -c "import json"

ModuleNotFoundError: No module named 'json'

/delete · /machines · json ok {"fresh": true} · new machine in 3.8 s
01machine-33bcc09b · python 3.12.14 · 1 cpu · 516 MB
02machine-caa9358d · python 3.12.14 · 1 cpu · 516 MB
03machine-d5b75fe8 · python 3.12.14 · 1 cpu · 516 MB

three POST /machines at 69.2 s, all 201 by 73.6 s · runs 01M3MFK929K… · K92D6… · K92ZJ…

The calls are free.
The machine meters itself.

Every Smol Machines endpoint on Monid bills nothing per call. The machine you boot is metered while it exists, by uptime, vCPU, memory, disk and egress, and settled monthly from your Monid balance.

Create · start · stop · delete/machines, /start, /stop, /deleteFree
Run a command/exec up to 25 s, /exec/async for longerFree
Upload · download/files/upload, /files/downloadFree
The machine itselfmetered while it exists, settled monthly≈ $0.10 / hour
with
$0
for the 41 API calls behind this page

Metering at the size on this page, 1 vCPU · 512 MB · 1 GB: $0.04 a machine-hour, $0.05 a vCPU-hour, $0.0162 a GB-hour of memory, $0.0001 a GB-hour of disk, $0.05 a GB out. A stopped machine still bills its disk. /delete ends it; so does ttlSeconds.

One key. 1,700+ tools.

A machine is one aisle. The same key reads pages, drives a browser, searches the web and finds who to write to, so the code the agent runs in its room has something to work on.

Boot a machinesmolmachine · /machines · free call
Run a commandsmolmachine · /exec, /exec/async
Move files in and outsmolmachine · /files/upload, /download
Stop, start, deletesmolmachine · disk kept until delete
Read a pagecontext.dev · markdown from a URL
Use a browsertinyfish · when a fetch is not enough
Scrape a sitemrscraper · rendered pages
Search the webexa · context before you code
Crawl a sectionfirecrawl · many pages, one call
Who to write toapollo · people and companies
A mailboxagentmail · the agent's own address
A voiceelevenlabs · read the result aloud

+ 1,700 more across 80 providers

Browse the catalog →