Odysseus × crabbox × islo.dev
What this is
Odysseus is a self-hosted,<br>local-first AI workspace — chat, agents, deep research, a model cookbook, email, calendar,<br>notes. Trying it normally means clone, venv, pip install, python setup.py,<br>boot uvicorn — on your machine.
This fork adds one file — crabbox.sh —<br>that does all of it on a remote islo.dev microVM instead, and throws the<br>box away when you're done. crabbox is the ephemeral<br>"warm a box, sync the diff, run the suite" path; the islo.dev CLI is the persistent "click the<br>live app" path. App code is untouched.
# no local install — just an islo.dev key<br>git clone https://github.com/zozo123/odysseus.git && cd odysseus<br>export ISLO_API_KEY=$(cat islo.key)
./crabbox.sh serve # boot Odysseus → public URL you can click<br>./crabbox.sh test # warm a box, run the suite, tear down<br>./crabbox.sh shell # interactive shell on the box
Pipeline
your laptop islo.dev microVM (python:3.12-slim)<br>┌───────────────────┐ ┌──────────────────────────────────┐<br>│ ./crabbox.sh test │ ──warm──▶ │ lease isb_… (golden-barnacle) │<br>│ 808 files 32.7MiB │ ──sync──▶ │ rsync working tree → /workspace │<br>└───────────────────┘ │ apt deps · pip · python setup.py │<br>│ pytest ──▶ stream stdout + exit │<br>exit code ◀──────────────── │ release lease (or --keep) │<br>└──────────────────────────────────┘
Live run · Odysseus suite on islo.dev
Green slice
99 passed<br>0 failed · 4 skipped · 41.3s on the box
Cold start → results
~1m43s<br>warm + sync 15.1s + install + run
Real exit codes
exit 1<br>surfaced a real upstream test failure
1 · warm a box, sync the checkout
leased isb_crabbox-odysseus-e8dffb slug=golden-barnacle provider=islo<br>sync candidate: 808 files, 32.7 MiB dirty_delta=5 files, 41.2 KiB<br>sync complete in 15.144s
2 · install + first-time setup (on the box)
▶ system deps apt-get install git build-essential<br>▶ python deps pip install -r requirements.txt<br>▶ first-time setup<br>[ok] data/ · logs/ · chroma/ · rag/ · memory_vectors/<br>[ok] .env created from .env.example<br>[ok] Database initialized<br>[ok] Initial admin user created (admin) # temp password printed
3 · run the suite — clean green slice
ODYSSEUS_TESTS="tests -q -k 'recurrence or static_mime or ordinal or preview or …'" ./crabbox.sh test<br>.....sss........................................................s....... [ 69%]<br>............................... [100%]<br>99 passed, 4 skipped, 1736 deselected in 3.70s<br>islo run summary sync=15.1s command=41.3s total=1m42.1s exit=0
4 · the harness reports real failures, too
A broader slice surfaced two genuine pre-existing upstream bugs — and<br>crabbox.sh propagated the non-zero exit straight back to the laptop. The box isn't<br>faking green:
FAILED tests/test_hwfit_quant_formats.py::…strict_not_lower_quant_fallback<br>TypeError: 'NoneType' object is not subscriptable # analyze_model() → None<br>FAILED tests/test_cookbook_helpers.py::test_pip_install_fallback_chain_propagates_failure_in_venv<br>2 failed, 104 passed, 4 skipped, 1729 deselected in 3.91s<br>islo run summary sync=15.0s command=42.8s total=1m43.6s exit=1<br>Honest scope. These are slices of Odysseus's 355-file suite chosen to run<br>fast and dependency-light; ODYSSEUS_TESTS=tests runs the whole thing. The point here is the<br>harness: warm → sync → install → run → real exit code, end-to-end, on a box that didn't exist<br>two minutes ago. Both failures are upstream's, not the sandbox's.
One flag, many providers
crabbox is a control plane that fronts ~25 sandbox/VM backends. The same<br>crabbox.sh runs Odysseus on any of them by swapping one flag — islo.dev is the<br>live-verified default here.
providerkindflagverified<br>islomicroVM--provider islo✓<br>local-containerlocal Docker--provider local-container·<br>e2b / daytona / modalcloud sandbox--provider …·<br>aws / gcp / hetznerVM--provider …·
Why this matters
"Self-hosted" usually means "I'll try it this weekend." A throwaway box collapses that to one<br>command: a reviewer, a CI job, or a curious stranger can stand the whole workspace up, click around<br>a real running instance, and discard it — without trusting it near their own machine. Generate once,<br>run anywhere, leave nothing behind.