For chat products that want their AI agent to actually do work: install packages, write files, run scripts. One Dedalus Machine per user, persistent home directory, sleeps between conversations. The user’sDocumentation Index
Fetch the complete documentation index at: https://docs.dedaluslabs.ai/llms.txt
Use this file to discover all available pages before exploring further.
~/.bash_history, project files, npm caches, and shell context all survive across sessions.
The browser agent cookbook shows the agent loop. This page is the multi-tenant wrapper: provision lazily, sleep aggressively, route the right agent to the right machine.
1. Provision lazily — one VM per user, on first message
2. On every chat turn: wake, drive, sleep
Why a per-user VM beats a per-session container
- State persists across turns and sessions.
cd /tmp/project && lsfollowed three days later bygit statusJust Works. Containers reset; the agent re-installs Node every conversation. - The filesystem is the agent’s long-term memory. Markdown notes the agent took, scripts it wrote, scraped data — all survive in
/rootindefinitely. No vector store required for “remember this project.” - Sleep-to-zero between conversations. A user who chats for 10 minutes a day costs 10 minutes of compute, not 24 hours.
- Real
apt-get, real Python venvs, real Cargo. No Lambda layer hacks.
Cost shape
- ~$X / vCPU-hour while awake (see pricing).
- ~$Y / GiB-month for sleeping storage.
- A user who actively chats 30 min/day on a 1-vCPU machine pays for 0.5 hours of compute plus 10 GiB of storage per month. Sleeping users only pay storage.
Security notes
- Per-user isolation is at the VM boundary. Each machine runs its own Linux kernel. There’s no shared-kernel container risk.
- Outbound egress is on by default. If the agent is allowed to run untrusted code on the user’s behalf, treat the VM as compromisable and don’t store cross-tenant secrets there. Issue scoped credentials per machine.
- Inbound is closed by default. A user’s machine isn’t reachable from the internet unless you explicitly create a port for it.
See also
- Browser Agent — the agent loop driving the terminal.
- Terminals — the WebSocket protocol your agent talks.
- Lifecycle — sleep / wake / destroy semantics.
