gantree

The product is the crane

A long-horizon harness you run. Not a plugin pack inside someone else’s.

Most things branded “harness engineering” are skills, agents, and slash commands that sit inside Claude Code or Copilot. That is a wrapper around a host you do not own. The host still holds context, tools, and whether the trajectory finishes.

ai-gantry is the runtime: one Distroless Go process, one persona, one OpenAI-compat model, memory you can sqlite3, chat that dials out. Gantree is the shipping yard those cranes live in — a board for an operator, never a hop in a chat turn.

gantry
The rigid frame that holds and positions tools. The frame does nothing by itself; the tools and the memory do the work.
gantree
The shipping yard those cranes live in. Files and Docker. Pull, don’t punch.

The difference

A harness is a process. A marketplace is a costume.

What this stack is

  • A binary you run. Aims, personality, and work still exist on Thursday.
  • The model is a socket — Ollama, Gemini, ChatGPT, Grok. Swap it. The loop stays.
  • MCP listed in mcp.toml is the grant. Omit it and it does not exist.
  • Outbound chat (Telegram, Discord, Slack). No open ports. Ever.
  • Independent lookups fan out in one round; the next round uses the results. Garmin → sheet → Strava is one thread.

What it is not

  • A Claude Code or Copilot plugin marketplace with “harness” in the README.
  • Prompts, skills, and sub-agents that still live in someone else’s context window.
  • A chatbot that dies when the window gets expensive, then /new lobotomizes it.
  • A dashboard or gateway in the token path so every message pays a platform tax.
  • MkDocs around a wrapper. Documentation is not a runtime.

The crane

ai-gantry holds the person. The yard does not talk.

One process. One persona. Chat stays Telegram. Health is an exit code, not a port. Mid-chain does not die on a typo — the loop was hardened on the 7–12B class, then pointed at Flash when you want the trajectory now.

static binary + persona + mcp.toml + any OpenAI-compat LLM  →  outbound chat

Want a bot tonight? Stay here. Open the board, build a crane — this yard pulls shotah/ai-gantry, writes the files, recreates. You do not need the other checkout to stand one up.

The yard

Operate named pets. Never sit in the turn.

Gantree is the operator plane: board, doctor, grants, logs, spend. It reads Docker and files after the fact. If a chart would make the harness slower, the chart is wrong. Agents open zero inbound ports. Only this UI is reachable, and only through a path you chose.

browser  →  gantree (localhost | Tailscale | tunnel)
                                                 gantry  gantry  gantry

Ada’s dashboard — CPU, memory, MCP, uptime, logs, doctor

Yard board with live cranes

Crane metric tiles — CPU, memory, tokens, completer, MCP, uptime

Log in — the door to the yard, not the chat The yard on a phone — named cranes, not a fleet dump A crane on a phone — start/stop and boxed folds

Hello

Docker on the same Linux host. Node 22. First boot is /setup.

git clone https://github.com/shotah/gantree.git
cd gantree
cp gantree.toml.example gantree.toml
npm install
npm run build
npm start                 # http://127.0.0.1:3000

Open the board. Build a crane. Grant a tool. Message it on your phone. The UI never sits in a chat turn. Home Mini vs cloud VM: install.

Operator docs

The board, the door, the files.