Machines and recipes
A machine is a virtual machine inside a workspace. A recipe is the blueprint that built it. A stack is a service installed on top. This page covers everything you can do at the machine level.
Open a machine#
From the workspace card, click Console to enter the workspace console. The left rail of the console lists every machine in the workspace; click one to focus its terminal in the center pane. From inside the console you can:
- Terminal: a live shell on the machine, in xterm.js. Multiple shells per machine supported.
- VS Code (port view): if the machine has the VS Code stack, a port view button opens the code-server UI in a new tab.
- Port view: any port the recipe declared (e.g. 3000 for a dev server) gets a button in the top bar to open it through a temporary HTTPS URL.
- AI / Chat: the right pane has an AI assistant tab and a Chat tab for talking to other members in the workspace.
See Workspace console for the full layout walkthrough.
Expose a port#
Need to share a dev server with a teammate, or open a database UI to a candidate? On the Ports tab, click Expose next to the port number. EasyEnv generates a temporary public URL that proxies to the machine.
Add a stack#
A stack is a service or addon installed onto an already-running machine. Where a recipe builds the whole machine from scratch (OS image, base packages, services), a stack recipe is a smaller piece of automation that runs once on top of an existing machine to install one specific thing.
Catalog stack recipes#
Every stack in the dashboard's Add Stacks grid maps to one of these. The k8s-only stacks at the bottom of the list are only enabled when the chosen recipe is a Kubernetes cluster.
| Field | Type | Description |
|---|---|---|
| GitHub | general | Clone a repository when the machine starts. Supports private repos through your connected GitHub account. |
| Claude | general | Install the Claude Code CLI. Run `claude` on the machine and follow the sign-in prompt to authenticate. |
| Bash | general | Install bash + oh-my-bash and append a custom snippet to ~/.bashrc. |
| Zsh | general | Install zsh + oh-my-zsh and append a custom snippet to ~/.zshrc. |
| Ansible | general | Run an Ansible playbook against the machine when it starts. Pass the playbook YAML in the inline editor. |
| VS Code | general | Install code-server so the machine can be used as a remote VS Code workspace. Surface comes through a Port View button in the console. |
| Docker Image | general | Pull one or more Docker images from a registry; the first runs as a container. Private hosts authenticate via the registries you saved in account settings. |
| Dockerfile | general | Paste a Dockerfile, build the image at boot, and run it as a container. |
| Docker Compose | general | Bring up a docker-compose.yml at boot. Docker and the Compose plugin are installed automatically if not present. |
| Helm / Kustomize / ArgoCD / FluxCD / cert-manager / Traefik / Longhorn / Cilium / Calico / Kubernetes Gateway API / Istio Ingress Gateway / Prometheus + Grafana / k9s | k8s only | These tiles are muted unless the recipe is a Kubernetes cluster (k3s, kind, k8s_cluster*). They install the corresponding addon into the cluster on boot. |
Add a stack from the dashboard#
Stacks are attached per machine, in step 2 of the Add Machines wizard step (or any time you click + Add Machine on a running workspace). Inside the Add a Machine modal, you go from Pick a Recipe → Add Stacks → Resources; the Add Stacks panel is a grid of every catalog stack with a search box on top.
- Open the workspace and click + Add MachineYou can also do this on an existing machine by editing the workspace and reopening the modal at the Add Stacks step.
- Pick the recipeThe recipe determines which stacks are eligible. K8s-only stacks (Helm, ArgoCD, Cilium, etc.) only enable when the recipe is k3s, kind, or another k8s_cluster recipe.
- Toggle stacksClick the stack tile to add it. Some stacks open a config form inline: GitHub asks for a repo URL, Docker Image takes an image list, Bash and Ansible give you a code editor for the script.
- Confirm Resources and Add MachineStep 3 is sliders for vCPU, RAM, and disk. Hit
Add Machineto push it into the workspace draft.
Add a stack from the CLI#
Same operation, scripted. Catalog form:
easyenv stack add \
--workspace api-stack \
--machine api-1 \
--stack docker-run \
--var image=nginx:latestSee the CLI stack reference for the full flag set.
When to reach for a stack vs a new recipe#
- One-off addition for one machine: stack. Cheaper than maintaining a custom recipe.
- Same change on every workspace your team boots: bake it into the recipe (or fork the recipe). A stack you have to remember to attach is a stack that will eventually be forgotten.
- Setting up a "broken" challenge: a tiny break-it stack on top of a known-good recipe is the cleanest way to author a hands-on challenge - the recipe stays reusable for non-interview workspaces.
SSH keys#
Each member's SSH public key is automatically pushed to every machine they can reach. Manage your keys at /dashboard/[account]/profile/keys. Removing a key revokes access to every running machine within seconds.
View boot and recipe logs#
Cloud-init and Ansible logs surface in the workspace audit (Audit button on a stopped or failed card). If you are debugging a custom recipe, this is where you will see your raise messages and Ansible task output.
Browse the recipe catalog#
The full list of recipes available to your account is at /catalog. Each recipe has a description, the OS image it targets, the packages it installs, and the services it starts.
