Skip to main content

Situation

Your bindu agent runs fine locally, but python my_agent.py ties it to your machine. The moment you close the terminal it’s gone — no public URL, no persistent identity, no way for other agents or users to reach it. Hosting it yourself means provisioning a server, managing TLS, keeping the process alive, and handling secrets safely. That’s infrastructure work that has nothing to do with your agent’s logic.

Task

Run your agent inside an isolated boxd microVM — with its own public HTTPS URL, cryptographic DID identity, and persistent state — without changing a single line of your agent script.

Action

1. Meet the requirements

  • A boxd account and credentials — bindu accepts either form (source):
  • The boxd runtime extra for bindu:

2. Preview before you spend anything

Prints the target VM name, source root, entry script, resource config, env-var keys (values hidden), tarball file count and compressed size, and any sensitive files that would be silently dropped. No VM is touched.

3. Deploy

That’s it. Same script you run locally, one flag, public URL.

4. Tune the deploy with CLI flags

5. Understand the lifecycle

  1. First run — bindu packages your project source, ships it to a fresh VM, runs pip install bindu plus your deps, starts your agent, and polls /health until ready. Cold path: ~10–30 seconds depending on dep weight.
  2. Subsequent runs (same agent name) — the CLI reuses the existing VM, updates source, restarts the agent. ~1–3 seconds.
  3. Ctrl-C with --on-exit=suspend (default) — the CLI calls box.suspend(), freezing the VM’s memory. DID keys, vector store, conversation history all survive. Re-running bindu deploy resumes in 1–3 seconds with state intact.
  4. --auto-suspend=N — while the agent is running, suspend after N seconds without an HTTP request. Avoid if the agent has scheduled tasks, streaming LLM calls, or websocket connections — those will be frozen mid-execution and most upstreams don’t tolerate resuming mid-RPC.

6. Pass secrets safely

The agent’s DID keys, x402 wallet, and OAuth tokens are generated and persisted inside the VM. BOXD_API_KEY / BOXD_TOKEN stays on your host and is never shipped. User secrets go in via --env:
The deploy CLI never ships secret-looking files. The exact patterns are defined in source_packager._SENSITIVE_PATTERNS: A warning lists what was dropped. Run --dry-run to see the full list before deploying.

7. Source packaging rules

Your project root is auto-discovered by walking up from the entry script looking for pyproject.toml, setup.py, requirements.txt, or .git (see find_project_root). The packager is inclusion-by-default: every file under the project root ships unless it matches an exclude rule. There is no allowlist of extensions — your .csv, .sql, .html, etc. all ship. Excluded by directory name (any path segment matches): __pycache__/, .git/, .venv/, venv/, node_modules/, .pytest_cache/, .mypy_cache/, .ruff_cache/ Excluded by suffix: .pyc, .pyo, .log, .sqlite, .db Also excluded: the sensitive patterns from Section 6, plus everything matched by .gitignore and .binduignore at the project root (same syntax as gitignore). Hard cap: 50 MB compressed. Bigger sources fail fast with a SourceTooLargeError pointing to .binduignore.

8. Dev tools while it’s running


Result

Your agent is live at https://<name>.boxd.sh — isolated, HTTPS, with a cryptographic identity and persistent state across suspends. You didn’t touch a server, write a Dockerfile, or manage TLS.

Troubleshooting

Sunflower LogoRuntime with boxd - turn your agent into a web discoverable service.