nc://smol

v0.1.0Pinned
ThomSharktools/nodecode-smol: Runs shell commands in a local smol machine: a hardware-isolated Linux microVM, apart from your files. - a rewrite of smol-machines/hermes-smolmachines (MIT), credited to smol-machines024bbcf· 10 Nov1 commit
test2 filescell.lisp7.4 KBmachine.lisp12.5 KB

nodecode-smol

Smol Machines: runs shell commands in a local Linux microVM. A Nodecode rewrite of smol-machines/hermes-smolmachines by smol-machines.

A smol machine is a microVM on this computer with its own Linux kernel, booted from an OCI image. The boundary is hardware virtualization, not a container sharing your kernel: nothing of this computer is mounted into it, so a build, a package install, an untrusted script or a rm -rf runs there and leaves your files alone. The plugin sent Hermes's whole terminal into one; this cell offers the same machine as a verb you can call beside the others.

Get it

Tell the agent "add the smol cell", or run nodecode add nc://smol.

Set it up

One prerequisite: the smolvm CLI, the engine's own, from smolmachines.com (brew install smol-machines/tap/smolvm, its install script, or a release binary). It runs on macOS on Apple Silicon, and on Linux on x86_64 or arm64 with glibc 2.34 or newer and /dev/kvm. The cell finds it on PATH; if it lives elsewhere, name it in the smol section under /settings or the Settings tab:

Setting Default What it does
binary smolvm the CLI: a name on PATH, or a path to it
image python:3.12-slim the OCI image a one-off machine boots from
network on whether a machine this cell boots gets outbound network
timeout_seconds 120 one command's ceiling
max_output 20000 the characters of output one answer carries
extra_args none arguments added to every machine run and machine create, for a flag this cell does not name

The first command in a new image pulls it from its registry (Docker Hub for the default), so the first boot of python:3.12-slim takes longer than the rest.

Use it

Ask in words -- "run this in a sandbox", "test that install in a clean Linux" -- and the model calls smol_run. Or call it yourself from eval:

(smol:run "uname -a")                          ; a one-off machine, removed when it exits
(smol:run "pip install pandas" :image "python:3.12-slim")
(smol:run "ls /root" :machine "dev")            ; a named machine, made on first use
(smol:run "make" :machine "dev" :timeout-seconds 600)
(smol:machines)                                ; the machines this computer holds

/smol CMD runs a command the same way and prints its output and exit code, /smol lists the machines, /smol stop NAME and /smol rm NAME free one, and (help :smol) has the rest. smol_machines (or (smol:machines) with a name) reports on the machines, the CLI's own listing in raw beside the names.

The answer is JSON:

{"ok": true, "exit_code": 0, "output": "Linux ...", "clipped": false,
 "machine": "dev", "image": "python:3.12-slim", "network": true,
 "seconds": 0.9, "notes": []}

A command that failed still answers, with ok false and its own exit_code; a command past its ceiling is killed and answers 124, the code timeout(1) uses. The machine runs bash -c CMD, so an image without bash (alpine) takes apk add bash first.

What changed in the rewrite

The plugin Here
a terminal backend: Hermes's every tool ran in the machine smol_run, smol_machines, /smol and (help :smol), beside the tools you already have
the Python SDK, installed as a plugin dependency the engine's smolvm CLI, so nothing Python is bundled
a machine per Hermes task, kept or deleted by container_persistent a one-off machine by default, or a named one that keeps its files
a Python result object, an 11 MiB stream cap a JSON answer with the exit code, the output, the machine, its image, the network, the seconds and notes

The machine is the same one: local, hardware-isolated, booted from the image you name, with nothing of the host mounted into it.

License

MIT, Copyright (c) 2026 smol machines: see LICENSE and NOTICE.

Add nc://smol

  1. 1

    Install Nodecode

    Once per machine.

    $ curl -fsSL https://nodecode.ai/install.sh | sh
  2. 2

    Add the cell

    Pinned at 024bbcf.

    $ nodecode add nc://smol

    Or tell the agent add the smol cell.