Getting started
Install the plugin, type /lets graph, and draw. This page covers the install, your first window, what "listening" means, and how a board travels back to Claude and comes back again.
Requirements
- Node 18+ and the
claudeCLI on your PATH. - git with credentials that can read the repository. While the repos are private, log in with
gh auth loginand rungh auth setup-git. - The Claude desktop app is the nicest home: windows open in its built-in browser pane, right next to the chat. Without a browser pane, Claude opens the window in your system browser.
Install with your agent
The easiest way: paste this line into Claude Code. It clones the repo, runs the installer and follows INSTALL.md, which is written for an agent to carry out step by step.
Install the `lets` plugin for Claude Code on this machine: clone https://github.com/TikoTikTok/lets (use `gh repo clone TikoTikTok/lets` — it is private, so make sure `gh auth status` is logged in and run `gh auth setup-git`), then run `node install.mjs` inside the clone and follow INSTALL.md in that repo. When done, tell me to restart Claude Code and show me `/lets graph`.
Install by hand
One command from a checkout:
gh repo clone TikoTikTok/lets
cd lets
node install.mjs
The installer adds the lets marketplace from GitHub, installs the lets plugin at user scope, installs the default uniques (graph, den) into ~/.lets/uniques, and installs a personal /lets alias. Restart the app or run /reload-plugins once, and both of these work in any session:
/lets:lets graph
/lets graph
Check that everything is in place with /lets:lets list, which lists the installed uniques.
Installer options
| Flag | Effect |
|---|---|
--local | Use the marketplace from this checkout instead of GitHub. |
--native | Also install the optional lets-native mod (Claude Code 2.1.287+). |
--no-skill | Skip the personal /lets alias. |
--uninstall | Remove what the installer added. |
With the plugin manager
Inside Claude Code:
/plugin marketplace add TikoTikTok/lets
/plugin install lets@lets
Then run node engine/bin/lets.mjs install-skill from a checkout for the bare /lets alias.
Your first window
/lets graph plan the auth flow. Claude opens the board in the app's browser pane, seeds a few nodes, and Doto says hi.- Draw. Double-click a node to rename it, drag from a node's edge to connect, right-click to summon or dismiss Doto, click him for suggestions.
- Press Send to Claude, or just keep chatting: window events reach Claude automatically with your next message.
- Ask for more. "Open an image uploader" and a paste/drop card appears; paste a screenshot and Claude reads the file. "Give me sliders for the weights" and sliders appear, and every change reaches Claude.
/lets entityshows who Doto is and what he has learned;/lets store timelinesearches the community store.
Everything the board can do is on The graph board.
Listening vs away
While /lets graph runs, Claude stays in an attentive loop and the window shows a green dot: everything you do in the window (chat, Ask, Send to Claude, Doto's menu, a pasted image) gets a reaction within seconds.
When Claude is not in that loop the dot turns amber and the chat says Doto is away. Nothing is lost: your messages are kept and delivered with your next prompt in Claude Code, by a prompt hook, at zero tool-call cost.
In the terminal CLI you can also load the plugin as a channel, and window events then wake Claude directly:
claude --dangerously-load-development-channels plugin:lets@lets
Send to Claude, handoff & resume new in 0.4.0
Pressing Send to Claude is a handoff. The window has done its job, so it steps out of the way:
- The engine saves the board as a session in
~/.lets/sessions/<unique>/<id>.json(one session per window; later sends from the same window update it). - Doto waves goodbye ("Sent. See you in Claude Code ✦", then a little "Bye.") and the window closes itself. If the browser won't let the tab close, the farewell stays up with a Keep working button that brings the window back.
- Claude answers in your Claude Code chat, not in the window: a short summary of the flow, the gaps it sees, and concrete additions you can say yes to. It also gives the session a short label.
This works even when Claude is away, because the engine does it, not the model.
Bringing a board back
Ask in plain words, "continue the auth board", or type:
/lets graph resume
Claude opens a fresh window, the engine replays the saved board into it (for graph, with graph.load), and Claude draws in the additions you agreed to. Every open lists the five most recent sessions for that unique (id, time, label, summary), so Claude can pick the right one from context.
| Where | What |
|---|---|
sessions tool | {action: list | get | label | remove, unique?, id?, label?}, used by Claude. |
open {unique, resume} | resume: "last" or a session id. |
lets sessions | The same list from the command line. |
~/.lets/config.json | "handoff": "close" (default) or "stay" to keep windows open after a send. |
Commands
| Type | Does |
|---|---|
/lets graph [intent] | Open a unique. Words after the name are the opening intent: /lets graph plan the auth flow. |
/lets graph resume | Reopen the last board you sent. new in 0.4.0 |
/lets list | List installed uniques and any problems. |
/lets store <query> | Search the store; install only after inspecting and saying yes. |
/lets entity | Who Doto is, what he learned, which special skills he has. |
/lets den | Open Doto's home: see and edit what he learned, by pointing. new in 0.6.0 |
/lets store cocode, then /lets cocode | Install and open cocode: type in any language, Claude predicts the next lines, builds and runs the real program. In the store, not a default. new |
/lets store mors, then /lets mors | Install and open mors: key a message in Morse, Claude reads it as a prompt and can answer in Morse. In the store, not a default. new |
/lets plan … | Split work into parallel waves and pick a model per task (below). |
Model routing
/lets plan … splits work into parallel waves and picks haiku / sonnet / opus per task from kind priors (format → haiku, architecture → opus …) and a ledger of past outcomes (~/.lets/router/ledger.json). Claude then spawns the waves with its Agent tool and reports back, so trust adjusts with evidence.
Keyboard
These work in every unique (they come from the shell):
| Key | Action |
|---|---|
| Right-click / Ctrl+Space | Summon or dismiss the companion |
| Enter on the companion | Open his menu (arrow keys move, Esc closes) |
| Ctrl+/ | Toggle the chat panel |
| Enter / Shift+Enter | Send / new line in chat |
| Esc | Close menus and bubbles |
Where state lives
Everything lives in ~/.lets/: uploads, the companion (persona, profile, memory, skills), the router ledger, installed uniques, logs, and (new in 0.4.0) saved sessions. Delete it to start fresh.
Update & uninstall
claude plugin update lets@lets # update
node install.mjs --uninstall # from your checkout: remove
Tip for the app's browser pane: open the window URL once with its #w=…&t=… hash. A hash-only navigation does not reload the page, so after a host restart navigate elsewhere first.