Three ways in, smallest first. The apps are static pages — there's nothing to install to use the GUI. You only need node for the agent/CLI loop.
Everything runs in your browser at tjs.mino.mobi. The typical loop:
moveOver / pickTip / aspirate / …). The panel shows the oracle's verdict (cycle time, or what's wrong) as you build.The pages are ES modules, so they need to be served over http:// (not file://). three.js and js-yaml load from a CDN, so keep internet on for the GUI.
git clone <repo-url> minomobi
cd minomobi
git checkout claude/gantry-playground-3js-phjc1x
cd tjs
# any static server rooted at tjs/ works — pick one:
python3 -m http.server 8000
# or: npx --yes serve -l 8000 .
# then open:
# http://localhost:8000/deck/
# http://localhost:8000/gantry/
tjs/ directory so /lib/ resolves — the pages import shared modules via ../lib/…, mirroring how the site is deployed.The whole engine is pure JavaScript and runs in node — so a local Claude can ground itself, write a sequence, and dry-run it against the same physics the site uses, fully offline. Hand your agent AGENTS.md (the contract), then use the CLI as the oracle:
cd tjs/lib
# optional — only if you feed YAML decks; JSON needs no deps:
npm i js-yaml
# what's on the deck: modules, joints, reachable sites, the verb grammar
node deck-cli.mjs manifest ../samples/pipetting.deck.json
# dry-run the deck's sequence -> structured diagnostics (exit 1 on errors)
node deck-cli.mjs check ../samples/pipetting.deck.json
# check a sequence file you wrote against a deck
node deck-cli.mjs check ../samples/pipetting.deck.json my-sequence.json
# one move's torque verdict
node deck-cli.mjs simulate ../samples/pipetting.deck.json bridge '{"x":260,"y":40}'
read manifest ─► write a sequence ─► check ─► fix what it flags ─► run
▲ │
└──────────────── iterate ─────────┘
A sequence is a JSON list of verb steps; the oracle catches out-of-reach sites, motor stalls, collisions, missing tips, over-capacity aspirates, and more before you run:
[
{ "device": "z_pip", "pickTip": "tips.1" },
{ "device": "z_pip", "aspirate": "src.A1", "uL": 50 },
{ "device": "z_pip", "dispense": "dst.A1", "uL": 50 },
{ "device": "z_pip", "dropTip": true }
]
To put it on the screen, paste or upload the deck YAML in /deck (Import) or /gantry (Import YAML). Start from a deck by clicking Export in /deck, or Manifest for Claude to copy the full contract to hand your agent.