Creating a VM
The default size is small (1 vCPU, 1 GB RAM, instant boot) in the eu region. Override with flags:
machine0 new my-vm --size large --region us --image ubuntu-24-04 --key my-key
| Flag | Description | Default |
|---|
--size | VM size (small through xxxl, or GPU sizes) | small |
--region | us, uk, eu, or asia | eu |
--image | Image slug | ubuntu-24-04 (auto-selects GPU image for GPU sizes) |
--key | SSH key name | Your default key |
--enable-proxy | HTTPS proxy at <vm>.mac0.io | true |
Creating a VM requires enough wallet balance for at least 10 hours of usage.
Listing VMs
Shows a table of all your VMs with name, status, IP, size, and region.
VM details
Shows full details including hardware specs, pricing, IP, SSH key, and timestamps.
Lifecycle
Start a stopped VM:
Stop a running VM:
Reboot a running VM:
Stopped VMs still incur charges because they reserve cloud resources. Destroy a VM to stop billing entirely.
SSH access
Connect interactively:
Run a command directly:
machine0 ssh my-vm "docker ps"
Use --username to connect as a different user (default is ubuntu):
machine0 ssh my-vm --username ubuntu
If the VM is still starting, the CLI waits for SSH to become available.
Updating a VM
Rename a VM or toggle its HTTPS proxy:
machine0 update my-vm --name new-name
machine0 update my-vm --enable-proxy false
Destroying VMs
Destroy a single VM:
Destroy all VMs:
Skip the confirmation prompt with --yes:
HTTPS proxy
Every VM gets an HTTPS endpoint at https://<vm-name>.mac0.io that proxies to port 80 on the VM. This is enabled by default and can be toggled with --enable-proxy.
Fixed IPs
Every VM gets a dedicated public IP for its lifetime. The IP is shown in machine0 get <vm> and machine0 ls output.
Ansible provisioning
Run an Ansible playbook against a VM:
machine0 provision my-vm playbook.yml
The CLI waits for SSH availability before running the playbook. This is how the base-24-04 system image is built — see the machine0 Ansible playbook.