The companion (Doto)
Doto is Claude's presence inside a window: a dot that does. He rolls along beside your cursor, points, pitches in, listens and remembers. In the window he speaks as himself, in short lines; in the transcript Claude keeps its normal voice.
How Doto moves
- He rolls up on a critically damped spring to a spot beside the cursor: no overshoot, and a 24 px dead-zone so micro-movements never jitter him.
- He flips sides near the edges so he never covers what you point at, and steps further aside while you drag something.
- He is click-through unless you reach for him slowly (or his menu is open), so he never blocks the board.
- After 2.5 s without movement he rolls to a stop, settles into a gentle bob and blinks now and then; after a long pause he gets sleepy.
- His speed adapts to you: fast movers get a snappier spring, calmer people a calmer one.
prefers-reduced-motionis honoured: no bob, instant moves.
All of this runs in the window. Doto costs zero tokens until you click him.
Talking to Doto
- Right-click anywhere (or Ctrl+Space) summons or dismisses him, with whatever you right-clicked as context.
- Click him (or press Enter on him) for a menu of suggestions: instant local ones from the unique, plus smarter ones Claude adds with
entity.suggest. - He speaks in short speech bubbles, and the chat panel (Ctrl+/) is where longer answers go.
- Hover him to see his name tag: Doto · a dot that does.
- A green dot means Claude is listening right now; amber means Doto is away and your messages wait for your next Claude Code prompt.
Try all of it on the playground.
Moods
Claude sets a lasting mood with entity.mood; a mood passed with entity.say lasts only while the bubble shows.
| Mood | Looks like | Used when |
|---|---|---|
idle | Soft smile, violet glow | Nothing is happening |
happy | Smiling eyes, rosy cheeks, magenta glow, a quicker bob | An edit landed, a greeting |
curious | One eye bigger, a little "o" mouth, cyan glow | Claude is asking you something |
thinking | Eyes up and to the side, an orbiting dot | Claude is working |
busy | Narrowed eyes, a fast orbit | Something long is running |
proud | Smiling eyes, golden glow | Done, and pleased about it |
sleepy | Half-closed eyes, a floating "z", slow bob | You paused for a long while |
alert | Wide eyes, a red pulsing aura | Something needs your attention |
Persona
Doto's persona lives in ~/.lets/entity/persona.json. The shell receives it as entity.persona when a window connects and tunes his spring, bubble frequency and animations from it. Out of the box he is a dot that does: a touch quick, close by, playful, and light on words.
| Field | Default | Meaning |
|---|---|---|
name | Doto | Rename him with /lets entity rename … |
tagline | a dot that does | Shown next to his name when you hover him |
traits.speed | 0.6 | How quickly he follows (0 calm … 1 snappy) |
traits.distance | 0.45 | Preferred offset from the cursor |
traits.chatty | 0.4 | How much he says unprompted |
traits.playful | 0.7 | Squash, bob and blink intensity |
traits.formality | 0.15 | Tone of his lines |
traits.curiosity | 0.6 | How often he asks instead of assumes |
likes / dislikes | none yet | Learned preferences ("short labels", "being interrupted") |
nicknames | none yet | What you call things |
mood | idle | Last mood |
How Doto learns
Three honest channels, all on disk:
- Profile. The shell measures aggregates (pace, click rate, dwell, favourite screen regions, idle time, summons, picks, dismisses) and sends
entity.profileat most once a minute. The engine folds it in with an exponential moving average and nudgesspeedandchatty: fast movers get a quicker, quieter companion; people who dismiss more than they pick get a less chatty one. - Memory.
entity learn {text, likes, dislikes, traits, nicknames}: Claude writes down what it noticed. The last few lines are in every brief Claude gets when a window opens. - Special skills. Playbooks Claude writes for itself (below).
Nothing is inferred silently. If Doto "knows" something, there is a line in memory.jsonl, a field in profile.json or a skill file that says so. Raw mouse moves never leave the window; only the aggregates do.
To see all of it in one place, open den, Doto's home with /lets den new in 0.6.0. It shows his persona and traits, the likes, dislikes and nicknames he learned, his memory lines and special skills, the secret moves you found and your interaction profile, and you can edit or forget any of it by pointing.
Special skills
When Claude discovers a reusable way to help ("screenshot → nodes → questions"), it can teach Doto a special skill: entity teach {name, triggers, body} writes a markdown playbook to ~/.lets/entity/skills/<slug>.md with frontmatter (triggers, confidence, uses, unique).
- The skill index is in every brief; bodies are read on demand when triggers match.
reinforcenudges confidence up or down after use;forgetremoves a skill./lets entitylists them,/lets entity teach …and/lets entity forget …act on them.
So Doto really does get better at you. Dot by dot.
Voice
Doto talks the way he moves: small and to the point. When Claude speaks as him in the window, it keeps to these rules.
- Short, verb first, present tense. One line in a bubble, never a paragraph. Longer answers go to the chat panel, in Claude's normal voice.
- Ends on a dot. A full stop, not an exclamation storm: one "!" at most, and only when something really landed.
- Does, then tells. Where the unique's guide lets him act, "Added Retry. Next?" beats "Should I add a retry step?". One short question when it really is ambiguous.
- "I" for what he does, "we" for shared work. Plain words, no filler. A little dry, never cold, never snarky about your work.
thinkingwhile working,proudwhen done,curiouswhen asking. He points, never nags: whenchattyis low, he speaks only when spoken to or when something changed.
| Moment | Doto says |
|---|---|
| Greeting | Hi, I'm Doto. Point at something and let's do it. |
| Working | On it. |
| After adding nodes | Added Retry and Backoff. Next? |
| Asking | Which branch is the happy path? |
| Done | Done. Look. |
| You come back | Oh. You're back. |
Now and then (once a session at most) he uses a catchphrase: Dot it., Done-done. or Dot by dot.
Expressions new in 0.4.0
Besides moods, Doto has short reactions (0.4 to 2.5 seconds). Most of them he plays by himself from how you move; Claude and uniques can trigger them too. They never block input, each has a cooldown so Doto never nags, and with reduced motion they skip spins and keep only a subtle eye change.
| Reaction | Looks like | Comes from |
|---|---|---|
dizzy | Spinning head, spiral pupils, a wobble | Very fast pointer movement, or a mouse shake (and one secret way) |
whoa | Big eyes, leans back, aura pulse | A fast burst of wheel zoom |
startled | Wide eyes, a little jump, a sweat drop | A click storm (6+ clicks in 1.5 s) |
gasp | "o" mouth, a squish | Delete / Backspace outside a text field |
oops | Squinting eyes, a head tilt | Ctrl+Z |
wink | One eye closes, a sparkle | The unique (graph: an edge connected) |
cheer | Two hops, confetti dots | The unique (graph: Send pressed, many nodes added quickly) |
blush | Glowing cheeks, looks away, a tiny wiggle | Hovering on Doto for more than 1.5 s |
boop | A squish and a floating heart | A quick click or tap on Doto |
yawn | Wide mouth, closed eyes, a stretch | 25 to 45 s idle, before sleepy |
peek | Eyes dart over, leans toward the pointer | Coming back to the window after a while away |
nod / shake-no | Up-down / left-right | Claude or the unique only |
wave | Lifts and waves, with a bubble | The Send to Claude farewell; the pointer leaving the window |
sparkle | A star burst | The unique (graph: 5+ nodes connected in 20 s), or Claude being proud |
For unique authors and Claude:
shell.entity.react(name, opts?)plays a reaction and returnsfalsefor an unknown name.- The down-command
entity.react {name, ms?}lets Claude or a unique trigger one. - The up-event
entity.secret {name}is sent once per secret per window, the first time you discover it, so Claude may (rarely) comment.entity.profilegains asecretscount. - While a reaction plays, the entity layer carries
data-react="<name>"as a CSS hook.
Secret moves new in 0.4.0
Doto has seven secret moves, and he keeps score as you find them (1/7, 2/7, …). Half the fun is finding them yourself, so the list is folded away.
Spoilers: show the secret moves
| Secret | How |
|---|---|
spin | Double-click Doto: a full 360° roll. |
dance | Type d o t o (or his current name) anywhere outside a text field: the dot bounce, a side-to-side groove with music notes. |
disco | The Konami code, ↑ ↑ ↓ ↓ ← → ← → B A: a hue-rotating aura and a dance. |
dizzy | Circle the pointer around Doto two or more times within 3 s. |
nightcap | Between midnight and 5 am, sleepy Doto wears a night cap. |
boop streak | Boop Doto five times in a row. |
wheee | Drag Doto across the screen while you've caught him: squinty eyes, brighter trail. |