Setup Scripts

Setup scripts prepare a sandbox after sources are cloned but before you start using it — installing language runtimes, syncing dependencies, building tools. There are two equivalent forms in islo.yaml: a single setup_script string or a named-step setup_scripts array.

When Setup Runs

Setup runs server-side as part of sandbox creation:

islo use (new sandbox)
├── Clone sources (from `sources:` in islo.yaml)
└── Run setup_script / setup_scripts

After setup completes, the sandbox is ready and your shell, command, or agent session starts.

Setup runs once during sandbox creation. Reconnecting to an existing sandbox (islo use <existing-name>) does not re-run setup — edit the script and recreate the sandbox to pick up new steps.

Execution Environment

PropertyValue
Userislo (non-root)
Working directory/workspace
Shellbash
SourcesAlready cloned under /workspace/...

If you need root, set user: root in islo.yaml. If you need a different working directory for your shell or agent session, set workdir: — that affects the session, not the setup script.

setup_script vs setup_scripts

Both fields produce the same result; pick whichever reads better for your project.

setup_script — one shell block:

1setup_script: |
2 curl -LsSf https://astral.sh/uv/install.sh | sh
3 export PATH="$HOME/.local/bin:$PATH"
4 uv sync

setup_scripts — named, ordered steps:

1setup_scripts:
2 - name: Install uv
3 script: |
4 curl -LsSf https://astral.sh/uv/install.sh | sh
5 export PATH="$HOME/.local/bin:$PATH"
6 - name: Sync Python deps
7 script: uv sync

Named steps appear individually in setup output and exec logs, which makes failures easier to attribute. Prefer setup_scripts for anything more than a few lines.

Adding Steps with islo add

islo add writes entries into setup_scripts: using built-in recipes.

$islo add # Interactive: detect tools, pick which to add
$islo add python 3.12 # Add the Python recipe pinned to 3.12
$islo add node 20 # Add the Node recipe pinned to 20
$islo add --script 'apt-get install -y curl' # Add a custom one-line step

Edit islo.yaml directly when you need something the recipes don’t cover.

Common Patterns

Python + uv

1setup_script: |
2 curl -LsSf https://astral.sh/uv/install.sh | sh
3 export PATH="$HOME/.local/bin:$PATH"
4 uv sync

Node + pnpm

1setup_script: |
2 corepack enable
3 pnpm install --frozen-lockfile

Multi-language with named steps

1setup_scripts:
2 - name: Install Rust
3 script: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
4 - name: Install Node deps
5 script: |
6 corepack enable
7 pnpm install
8 - name: Build
9 script: cargo build --release

Install an agent CLI

1setup_scripts:
2 - name: Install Claude Code
3 script: curl -fsSL https://claude.ai/install.sh | DISABLE_AUTOUPDATER=1 bash

Templates

islo init --template <name> writes a starter islo.yaml with a sensible setup_script for the language. Run islo init --list to see what’s available; current options include default, python, node, rust, go, and fullstack.