onctl is a tool to manage virtual machines in multi-cloud.
Check ๐ https://onctl.sh for detailed documentation
- ๐ Simple intuitive CLI to run VMs in seconds.
- โ ๏ธ Supports multi cloud providers (aws, azure, gcp, hetzner, ovh, more coming soon...)
- ๐ฆ Hosted microVMs with the
boxesprovider: no cloud account, no host to run --onctl loginonce with a token from boxctl.io, thenonctl create -p boxes. Boxes have no public address;onctl ssh(and plain ssh viaonctl ssh-proxy) reach them through the service. - ๐ค
onctl claude: run Claude Code on a box instead of your laptop -- a hosted box, or your own VM on any provider (onctl -p hetzner claude; on a Mac,onctl -p ac clauderuns it in an Apple container from the prebuilt claude-agent image) -- a fresh box per run with your project cloned (or copied) there, its work fetched back asbox/*and the box deleted when Claude exits (--keepfor a long-lived project box;--repo owner/nameclones a GitHub repository with no local copy), Claude in tmux so it keeps going when you detach, several tasks at once (--task), and the work back as git (onctl claude fetch/push). - ๐ฅ Run local microVMs with the
fc(Firecracker) provider (Linux + KVM, no cloud account needed). No bare-metal Linux box? Create a nested-virtualization-enabled GCP VM (gcp.vm.nestedVirtualization: true) withonctl create -n fc-host -a firecracker/firecracker-host-setup.sh, then SSH in and runONCTL_CLOUD=fc onctl create -n my-microvm. - ๐ Run local sandboxes on a Mac with the
ac(Apple container) provider: each one is a lightweight Linux VM on Virtualization.framework (macOS 26+, no cloud account needed). Install thecontainerCLI, runcontainer system start, thenONCTL_CLOUD=ac onctl create -n my-sandbox(any OCI image via--image; sshd is set up on first boot).pause/resumemap tocontainer stop/start. - ๐ก๏ธ Run policy-enforced sandboxes on an NVIDIA OpenShell gateway with the
openshellprovider: outbound connections are denied by default and credentials stay out of the sandbox. Set up a gateway on any VM withonctl create --image ubuntu-24.04 -a openshell/openshell.sh, register it withopenshell gateway add(the template prints how), thenonctl create -p openshell -n my-sandbox. Sandboxes are unprivileged, so their software comes from--image, not-a. - ๐ฎ Run local microVMs with the
ch(Cloud Hypervisor) provider โ same idea asfc(Linux + KVM, no cloud account needed), no pause/resume support yet. Pointch.kernelImage/ch.rootfsImageat a kernel + rootfs image and runONCTL_CLOUD=ch onctl create -n my-microvm. Also supports Windows guests via--ch-os windows(UEFI boot) โ see TESTING-ch-windows.md for base-image prep; unverified against real hardware. - ๐ Sets your public key and Gives you SSH access with
onctl ssh <vm-name> - โจ Cloud-init support. Set your own cloud-init file
onctl up -n qwe --cloud-init <cloud.init.file> - ๐ค Use ready to use templates to configure your vm. Check onctl-templates
onctl up -n qwe -a k3s/k3s-server.sh - ๐๏ธ Use your custom local or http accessible scripts to configure your vm.
onctl ssh qwe -a <my_local_script.sh> - ๐ฅ Import a server onctl didn't create (e.g. a Hetzner auction/dedicated box) so you can
ssh/lsit too:onctl import <name> --ip <ip>
initialize project. this will create a .onctl directory. check configuration file and set as needed.
โฏ onctl init
onctl environment initialized
export ONCTL_CLOUD to set Cloud Provider.
โฏ export ONCTL_CLOUD=hetzner
Be sure that credentials for that specific cloud provider is already set.
If you already use cloud provider CLI. They're already . ex. az, aws, hcloud
โฏ echo $HCLOUD_TOKEN
Create VM.
โฏ onctl up -n onctl-test
Using: hetzner
Creating SSHKey: onctl-42da32a9...
SSH Key already exists (onctl-42da32a9)
Starting server...
Server IP: 168.119.58.112
Vm started.
Ssh into VM.
โฏ onctl ssh onctl-test
Using: hetzner
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-89-generic x86_64)
.
.
.
root@onctl-test:~#
Or browse and manage your VMs in a k9s-style terminal UI: s opens a shell, a runs Claude Code on the VM (onctl claude), c creates, p/r pause and resume, ctrl-d destroys, :images and :sizes show what the provider offers, :repos lists your GitHub repositories and enter starts Claude on a box with one cloned (onctl claude --repo), :provider switches clouds, ? lists every key.
โฏ onctl tui
Already have a server onctl didn't create โ a Hetzner auction/dedicated box (these live on Hetzner's Robot API, a different product from Hetzner Cloud, so the hetzner provider can never see them), or any other reachable host? Register it so ssh/ls work against it too:
โฏ onctl import myauctionbox --ip 1.2.3.4 --user root --key ~/.ssh/auction_key
โ Imported "myauctionbox" (1.2.3.4)
Use it with: onctl --provider static ssh myauctionbox
โฏ onctl --provider static ls
โฏ onctl --provider static ssh myauctionbox
Imported hosts only support ssh/ls/destroy โ destroy just forgets the host locally, it never touches the real machine, since onctl didn't create it and has no lifecycle API for it.
curl -fsSL https://onctl.sh/get.sh | bashThe installer downloads the release for your OS and architecture, verifies it against the release checksums, installs onctl to ~/.local/bin (override with ONCTL_INSTALL_DIR), and adds that directory to your PATH in ~/.bashrc, ~/.zshrc or fish's config if it isn't there already. No sudo. Open a new terminal afterwards. To install a specific version, set ONCTL_VERSION=v0.1.34. Windows users can grab onctl-windows-amd64.zip from the releases page.
To install or update to the edge build, a binary rebuilt from the tip of main on every push (no Windows build):
curl -fsSL https://onctl.sh/get-edge.sh | bashThe install scripts also set up tab completion for your shell (bash,
zsh or fish): subcommands, flags, and the names of your own VMs, so
onctl ssh my-b<TAB> finishes the name for you. Open a new terminal
after installing to pick it up.
It works by writing a completion script to your shell's per-user
completion folder and, for bash and zsh, adding one line to ~/.bashrc
or ~/.zshrc that loads it. To skip this, run the installer with
ONCTL_NO_COMPLETION=1:
curl -fsSL https://onctl.sh/get.sh | ONCTL_NO_COMPLETION=1 bashTo set it up by hand instead:
echo 'source <(onctl completion bash)' >> ~/.bashrc # bash
echo 'source <(onctl completion zsh)' >> ~/.zshrc # zsh
onctl completion fish > ~/.config/fish/completions/onctl.fishVM names are looked up live from your cloud provider, so completing them
needs an initialized .onctl directory and working credentials.
- download windows binary from releases page
- unzip and copy onctl.exe to a location in PATH
โฏ onctl
onctl is a tool to manage cross platform resources in cloud
Usage:
onctl [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
create Create a VM
destroy Destroy VM(s)
help Help about any command
import Import an existing server so it can be managed with ssh/ls
init init onctl environment
ls List VMs
ssh Spawn an SSH connection to a VM
version Print the version number of onctl
Flags:
-h, --help help for onctl
Use "onctl [command] --help" for more information about a command.
See CONTRIBUTING.md for how to report issues and what a pull request needs.
For development guidelines โ especially when using AI coding agents (opencode, Claude, etc.) โ see AGENTS.md.
Important: When running multiple AI agents in parallel on this repo, you must use separate git worktrees (or clones) for isolation. See the "Coordinating multiple agents..." section in AGENTS.md.