mino.mobi / tjs / quickstart

Quickstart

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.

Deck layout →Place HBots, linear axes, and labware; mount them into a kinematic tree; author a sequence; export YAML.
Motion suite →Drive any device with jerk-limited motion; read per-motor torque; run the sequence across the cell.

1Use the hosted apps (no setup)

Everything runs in your browser at tjs.mino.mobi. The typical loop:

  1. Open /deck — drop in modules (HBot, linear axis, well plate, tip rack, tube rack, waste), mount them, and author a sequence with the verb picker (move / moveOver / pickTip / aspirate / …). The panel shows the oracle's verdict (cycle time, or what's wrong) as you build.
  2. It autosaves. Open /gantry and click Load from editor to pull that deck in.
  3. Pick a device, nudge the target sliders, hit Run move, or Run sequence to watch the whole cell execute.
A fresh visit lands on a working pipetting sample (an HBot positioning a pipettor over a tip rack, source/destination plates, and a waste chute) so you have something to drive immediately.

2Run it locally

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/
Serve from the tjs/ directory so /lib/ resolves — the pages import shared modules via ../lib/…, mirroring how the site is deployed.

3Drive it from a local Claude

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}'

The loop

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.

4What's built vs. coming