What the Daytona integration enables
| Feature | How it’s used |
|---|---|
| Sandboxed execution | Agent tool calls (shell commands, file edits, grep, glob) run inside a cloud VM instead of on the host |
| Snapshots | Pre-built environment images so each run starts with dependencies already installed |
| SSH access | Connect to a running sandbox for live debugging |
| Network controls | Restrict agent egress with block-all or CIDR-based allow lists |
| MCP sandbox transport | Run MCP servers inside the sandbox — e.g., Playwright for browser automation |
Prerequisites
- A
DAYTONA_API_KEYenvironment variable (get one from app.daytona.io) - A GitHub App configured via the web UI (required for private repository cloning and checkpoint pushing)
Configuration
Set the sandbox provider in your run config TOML or via CLI flag:run.toml
run.toml
Network access control
Control outbound network access with thenetwork field. Three modes are available:
run.toml
"block" or a CIDR allow list when running untrusted or generated code to prevent agents from making arbitrary network requests.
Snapshots
Snapshots let you pre-build an environment image so each run starts with dependencies already installed rather than installing them in setup commands every time.run.toml
dockerfile is provided, Fabro creates it automatically and polls until it reaches Active state (up to 10 minutes). If the snapshot already exists, it’s reused immediately.
If the snapshot doesn’t exist and no
dockerfile is provided, the run fails immediately. Without a snapshot, sandboxes are created from the default ubuntu:22.04 image.Private repositories
Fabro automatically clones the current repository into the sandbox at/home/daytona/workspace. Public repositories work without extra configuration. Private repositories require a GitHub App — Fabro uses short-lived Installation Access Tokens scoped to the specific repository.
If the clone fails without a GitHub App configured, Fabro suggests running the setup flow:
SSH access
Connect to a running Daytona sandbox via SSH for live debugging:SSH credentials cannot be refreshed during a run. To keep the sandbox alive after the run completes, combine
--ssh with --preserve-sandbox.Sandbox lifecycle
Each sandbox gets a unique timestamped name (e.g.fabro-20260307-143022-a3f2) and is created as ephemeral. By default, sandboxes are destroyed when the run finishes.
Preservation
To keep a sandbox alive for debugging:run.toml
Auto-stop
Theauto_stop_interval setting tells Daytona to stop the sandbox after a period of inactivity, saving costs for preserved or long-running sandboxes:
run.toml
Server defaults
When running viafabro serve, the server config at ~/.fabro/server.toml can set default Daytona settings for all runs. Run config TOML values override server defaults. Labels are merged — run config labels win on key collisions. The network setting uses simple override (run config replaces the server default entirely).
See Server Configuration for details.
Troubleshooting
”Failed to create Daytona sandbox”
TheDAYTONA_API_KEY environment variable is missing or invalid. Verify it’s set in your .env file and check that it’s a valid key from app.daytona.io.
”Snapshot does not exist and no dockerfile provided”
The run config references a snapshot name that doesn’t exist on Daytona, and nodockerfile is provided to create it. Either create the snapshot manually in the Daytona dashboard or add a dockerfile field to [sandbox.daytona.snapshot].
”Timed out waiting for snapshot to become active”
Snapshot creation took longer than 10 minutes. This can happen with large Dockerfiles. Check the snapshot status in the Daytona dashboard — it may still be building. Subsequent runs will reuse the snapshot once it’s active.Git clone fails for private repositories
See Private repositories above. You need a GitHub App configured and installed on the repository’s organization or account.Stall watchdog kills the run
Long-running commands in Daytona sandboxes may trigger the 1800-second stall watchdog if they don’t produce events. For workflows with long-running operations, increase thestall_timeout in the workflow graph: