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/ubuntu",
});
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 | |
| Ubuntu 24.04 LTS | 2 | 4 GiB | 16 GB | |
| default | Ubuntu 24.04 LTS | 4 | 8 GiB | 32 GB |
| Ubuntu 24.04 LTS | 8 | 16 GiB | 64 GB | |
| Ubuntu 24.04 LTS | 16 | 32 GiB | 128 GB | |
| Ubuntu 24.04 LTS | 32 | 64 GiB | 128 GB | |
| Ubuntu 24.04 LTS | 64 | 128 GiB | 256 GB |
Click a slug to copy it.
Which sizes you can use depends on your plan’s per-VM maximums.
Free tops out at freestyle/ubuntu, Hobby at freestyle/ubuntu-lg, and Pro at
freestyle/ubuntu-2xl. freestyle/ubuntu-3xl is larger than any published
plan allows and needs custom limits — talk to
sales.
Which one to pick
freestyle/ubuntu— the default, and what every guide assumes. It is a real Ubuntu 24.04 machine rather than a repackaged container image: systemd is pid 1, sosystemctl,journalctl, units, and timers all work.ping,curl,dig,ss,traceroute,tcpdump,git,vim,sudo, and man pages are already installed. Docker runs from boot withcomposeandbuildx. Node.js LTS (node,npm,npx,bun) and a Python 3 with the common data-science and model-provider packages are onPATH.wgandwg-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, which is who SSH lands you as.-smthrough-3xlare that same image with different hardware. Nothing about the software changes between them, so pick by how much room the workload needs and check it against your plan’s maximums.freestyle/busybox— a minimal appliance: no package manager, no libc,shonly. For smoke tests, CI, and anything that has to fit where a 32 GB rootfs will not. Too small for editor connections: the VS Code/Cursor remote server needs a dynamic libc and more than 128 MiB of memory. Terminal SSH is fine — for IDE work, pick an Ubuntu snapshot.
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);