Skip to main content

Lab settings

Open a lab and go to Preferences. Everything here is saved when you click Save Preferences and applied on the next deploy — or immediately if you use Apply & Redeploy now.

The Preferences page showing the startup script editor and the password fields.

Startup script

The most useful setting on this page. It runs as root on every deploy, so it is how you make your setup survive a rebuild.

#!/bin/bash
apt-get update
apt-get install -y nginx postgresql-client jq

# your home directory persists, so restore from it
if [ -f /home/$USER/site.conf ]; then
cp /home/$USER/site.conf /etc/nginx/sites-available/default
fi

systemctl enable --now nginx

Run now executes it immediately and streams the output, so you can test without redeploying.

A broken script can stop the lab coming up

It runs as root at the end of every deploy. Test with Run now before relying on it, and keep it idempotent — it runs again on every single deploy.

Passwords

PasswordUsed for
sudosudo inside the lab
code-serverThe browser VS Code
VNCLabs with a graphical desktop

Leave a field blank and a fresh one is generated on each deploy. Set one and it is applied on the next deploy and stays.

SSH keys

By default every enabled key on your account is installed into a deployed lab. Manage the keys themselves in Account Settings → SSH.

To narrow it for one lab, pick specific keys in that lab's settings.

Keys are installed at deploy time

Adding a key to your account changes nothing in labs that are already running. Redeploy the lab to install it.

Always-on

Keeps the lab exempt from idle expiry. If it stops unexpectedly, a background worker brings it back within about ten minutes, as you, with your saved settings.

Requires: the lab's template to allow it, and a paid plan or 5,000 Zeal. When you are not eligible the switch is visible but locked, so you can see it exists.

Paused labs are deliberately not restarted

Always-on does not resume a lab you paused — restarting it would destroy the state you paused to keep.

Custom error page

The page visitors see on your domains while the lab is down. Maximum 64 KB; leave it empty for the platform default.

This one applies immediately — no redeploy needed. Available once the lab is publicly reachable.

Agent prompt

Instructions an AI assistant receives when it works with this lab through MCP — project conventions, where things live, what not to touch. Maximum 64 KB.

Reserved address

Request a specific private address so the lab keeps the same one across redeploys. Useful when you have scripts or firewall rules pointing at it.

Applying changes

ChangeTakes effect
Custom error pageImmediately
Startup scriptNext deploy, or Run now
Passwords, SSH keys, always-on, addressNext deploy
Routing and domainsUse Apply & Redeploy — see Publishing ports

Do it with an AI assistant

You can also do this by asking an AI assistant connected to your account — see Connect an AI assistant to set one up.

AskWhat the assistant does
“Add a line to my lab's startup script that installs jq, then run it”Reads the current script with lab_startup_script, writes it back with the new line, and redeploys with deploy_lab
“Set the sudo password on my essentials lab”set_lab_password, then deploy_lab
“Only let my work-laptop key into this lab”Finds the key with list_ssh_keys, saves the selection with configure_lab_runtime, then deploy_lab
“Keep my lab always on”configure_lab_runtime, then deploy_lab
Settings save now and apply on the next deploy

Every change here is stored straight away but reaches the lab only when it is deployed again, so ask the assistant to redeploy afterwards. The startup script is replaced as a whole, not appended to — the assistant should read it before changing it.