Freestyle Docs

Freestyle / Docs

Base Snapshots

Ready-to-boot public images and their sizes.

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

SlugBasevCPUMemoryDisk
BusyBox1128 MiB1 GB
Ubuntu 24.04 LTS24 GiB16 GB
defaultUbuntu 24.04 LTS48 GiB32 GB
Ubuntu 24.04 LTS816 GiB64 GB
Ubuntu 24.04 LTS1632 GiB128 GB
Ubuntu 24.04 LTS3264 GiB128 GB
Ubuntu 24.04 LTS64128 GiB256 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, so systemctl, 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 with compose and buildx. Node.js LTS (node, npm, npx, bun) and a Python 3 with the common data-science and model-provider packages are on PATH. wg and wg-quick run against a kernel with WireGuard built in, so a VM can join a tunnel with nothing to install. There is an ubuntu user with passwordless sudo alongside root, which is who SSH lands you as.
  • -sm through -3xl are 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, sh only. 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);
esc