Boot a base snapshot by passing its slug as snapshotId. They start in
about a second:
const { vm } = await freestyle.vms.create({
// Required: a VM reaches nothing it has not been allowed to.
firewall: { rules: [{ action: "allow", source: {}, destination: { public: true } }] }, snapshotId: "freestyle/debian-13" });
Hardware is baked in: a snapshot boots with the vCPU, memory, and disk
listed below. Omit snapshotId to get the default.
Available images
| Slug | Base | vCPU | Memory | Disk |
|---|---|---|---|---|
| BusyBox | 1 | 128 MiB | 1 GB | |
| BusyBox | 2 | 512 MiB | 2 GB | |
| Debian 13 | 4 | 8 GiB | 16 GB | |
| Debian 13 | 8 | 16 GiB | 32 GB | |
| Debian 13 | 16 | 32 GiB | 64 GB | |
| default | Ubuntu 24.04 LTS | 4 | 8 GiB | 16 GB |
| Ubuntu 24.04 LTS | 8 | 16 GiB | 32 GB | |
| Ubuntu 24.04 LTS, systemd | 4 | 8 GiB | 16 GB |
Click a slug to copy it.
Which sizes you can use depends on your plan’s per-VM maximums.
Which one to pick
freestyle/ubuntu-2404— the default. Broadest compatibility; everything in the guides works here. It is built from the Ubuntu container base image, so it starts where a container starts: no systemd, and noping/curluntil youapt installthem.freestyle/ubuntu-2404-systemd— the same Ubuntu, built to be a machine instead. systemd is pid 1, sosystemctl,journalctl, units, and timers all work;ping,curl,dig,ss,traceroute,tcpdump,git,python3,vim,sudo, and man pages are already there; andwg/wg-quickrun against a kernel with WireGuard built in, so a VM can join a tunnel with nothing to install. There is anubuntuuser with passwordless sudo alongsideroot. Newer than the others — pick it when you want a normal Linux box, andfreestyle/ubuntu-2404when you want the long-standing default.freestyle/debian-13— leaner Ubuntu alternative: apt and glibc without the extras. Also a container base image, with the same caveat.freestyle/busybox-nano— minimal appliance: no package manager, musl,shonly. For smoke tests and CI. Too small for editor connections: the VS Code/Cursor remote server needs a dynamic libc and more than nano’s 128 MiB of memory. Terminal SSH is fine — for IDE work, pick an Ubuntu or Debian snapshot.-large/-xlare the same images with more memory and disk.
Custom snapshots
Start from a base snapshot, set it up however you want, resize if you need more, and capture its exact memory and disk. The source VM must be running or paused:
const { snapshotId, snapshot } = await vm.snapshot({
slug: "configured-worker",
});
const { vm: clone } = await freestyle.vms.create({
// Required: a VM reaches nothing it has not been allowed to.
firewall: { rules: [{ action: "allow", source: {}, destination: { public: true } }] }, snapshotId });
New snapshots are private, and snapshot() returns once the snapshot is fully
materialized and ready to boot.
Manage snapshots from freestyle.vms.snapshots:
const { snapshots } = await freestyle.vms.snapshots.list({ sourceVmId: vmId });
const current = await freestyle.vms.snapshots.get(snapshotId);
await freestyle.vms.snapshots.update(snapshotId, { slug: "golden-image" });
await freestyle.vms.snapshots.delete(snapshotId);