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

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

FlagEffect
--localUse the marketplace from this checkout instead of GitHub.
--nativeAlso install the optional lets-native mod (Claude Code 2.1.287+).
--no-skillSkip the personal /lets alias.
--uninstallRemove 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

  1. /lets graph plan the auth flow. Claude opens the board in the app's browser pane, seeds a few nodes, and Doto says hi.
  2. 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.
  3. Press Send to Claude, or just keep chatting: window events reach Claude automatically with your next message.
  4. 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.
  5. /lets entity shows who Doto is and what he has learned; /lets store timeline searches 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:

  1. 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).
  2. 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.
  3. 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.

WhereWhat
sessions tool{action: list | get | label | remove, unique?, id?, label?}, used by Claude.
open {unique, resume}resume: "last" or a session id.
lets sessionsThe same list from the command line.
~/.lets/config.json"handoff": "close" (default) or "stay" to keep windows open after a send.

Commands

TypeDoes
/lets graph [intent]Open a unique. Words after the name are the opening intent: /lets graph plan the auth flow.
/lets graph resumeReopen the last board you sent. new in 0.4.0
/lets listList installed uniques and any problems.
/lets store <query>Search the store; install only after inspecting and saying yes.
/lets entityWho Doto is, what he learned, which special skills he has.
/lets denOpen Doto's home: see and edit what he learned, by pointing. new in 0.6.0
/lets store cocode, then /lets cocodeInstall 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 morsInstall 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):

KeyAction
Right-click / Ctrl+SpaceSummon or dismiss the companion
Enter on the companionOpen his menu (arrow keys move, Esc closes)
Ctrl+/Toggle the chat panel
Enter / Shift+EnterSend / new line in chat
EscClose 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.