Summary
Make the floating mascot something you can actually talk to. While the mascot is visible, a hotkey is live: hold it and speak, release and it answers. You can also start and stop it by clicking the mascot itself. It reacts visibly through distinct states — idle, hovered, listening — and shows the reply in a short summary beside it. The mascot also stops floating anywhere on screen and instead settles into one of three fixed positions. The conversation is backed by a real chat with full capability, so anything you can do in a normal chat you can do by talking to the mascot.
Intended to land as one change, not split — the docking work and the talk-to-it work share the same surface and would otherwise conflict.
Problem
The mascot exists today and floats above everything, including fullscreen apps. But it's decorative — it reacts to hover and nothing else. It doesn't listen, doesn't know when you're speaking, and never replies.
Separately, the app already has a voice loop that records, transcribes, thinks, and speaks back, with its own hotkey. The two have never been connected, and the voice loop's status displays in a different panel pinned to the top of the screen rather than on the mascot.
The pieces exist. There's just no way to talk to the little guy on your desktop.
Docking
The mascot rests in one of three positions only:
- left edge, vertically centred
- right edge, vertically centred
- bottom edge, horizontally centred
Pick it up and move it, and it settles into whichever is nearest. This replaces today's behaviour of staying wherever it's dropped. The chosen position is remembered across restarts.
Visual states
Each state needs to communicate something specific. The exact visual design is open — what matters is that they're distinguishable at a glance.
Idle — minimal and unobtrusive. Small enough to sit at the screen edge without competing with whatever you're working on.
Hover — reveals what you can do: the microphone as the primary action, and the hotkey named somewhere visible so the shortcut is discoverable without hunting for it.
Listening — unmistakably live. Something that responds to your voice in real time, so you can tell it's actually hearing you rather than sitting there frozen. Cancel and confirm both reachable directly.
Moving — the three dock positions shown as targets so you can see where it will land before letting go, with the nearest one indicated.
Replying — a short summary beside the mascot, readable at a glance, opening toward the screen and never off the edge: rightward when docked left, leftward when docked right, upward when docked at the bottom.
Interaction
The hotkey is live only while the mascot is visible. Toggle the mascot off and the hotkey goes away — nothing to configure, and nothing left running in the background you forgot about.
Two ways to start talking: hold the hotkey and speak, releasing when done; or click the mascot to start and click again to stop. Either way, cancel and confirm are also reachable on the listening control — cancel discards the capture, confirm ends it and sends what was captured.
It's a real conversation. Back-and-forth works and it remembers the thread. It has the same capability as any chat in the app, including web search. Talking to the mascot shouldn't be a lesser experience than typing in the app.
Decisions to make
- General chat or a dedicated desktop thread? Either the mascot talks into your normal chat history, or it gets its own thread scoped to desktop use. Affects where the conversation shows up, so worth settling early.
- Which hotkey. Cmd+Shift+T suggested. Global hotkeys capture system-wide, so whatever is chosen stops working in every other app while the mascot is visible. Cmd+T was ruled out for this reason — it's New Tab almost everywhere.
- Click or double-click to activate, given that picking the mascot up also uses the mouse.
- Which position it starts in on a fresh install. It currently starts bottom-right, which isn't one of the three.
- Does idle still show the mascot character, or does the character appear only on hover?
Worth knowing
- The floating mascot is macOS-only today. Windows and Linux would need separate work.
- The existing voice path can hold a conversation but can't actually do anything — no web search, no tools. Meeting the "same as any chat" requirement means routing through the app's real chat rather than extending the current voice path.
- The current voice hotkey only registers when you open a settings panel, and stops working after an hour. Tying it to mascot visibility instead replaces that, and is simpler.
Acceptance criteria
Docking and position
States
Activation
Conversation
Failure handling
Platform and quality
Summary
Make the floating mascot something you can actually talk to. While the mascot is visible, a hotkey is live: hold it and speak, release and it answers. You can also start and stop it by clicking the mascot itself. It reacts visibly through distinct states — idle, hovered, listening — and shows the reply in a short summary beside it. The mascot also stops floating anywhere on screen and instead settles into one of three fixed positions. The conversation is backed by a real chat with full capability, so anything you can do in a normal chat you can do by talking to the mascot.
Intended to land as one change, not split — the docking work and the talk-to-it work share the same surface and would otherwise conflict.
Problem
The mascot exists today and floats above everything, including fullscreen apps. But it's decorative — it reacts to hover and nothing else. It doesn't listen, doesn't know when you're speaking, and never replies.
Separately, the app already has a voice loop that records, transcribes, thinks, and speaks back, with its own hotkey. The two have never been connected, and the voice loop's status displays in a different panel pinned to the top of the screen rather than on the mascot.
The pieces exist. There's just no way to talk to the little guy on your desktop.
Docking
The mascot rests in one of three positions only:
Pick it up and move it, and it settles into whichever is nearest. This replaces today's behaviour of staying wherever it's dropped. The chosen position is remembered across restarts.
Visual states
Each state needs to communicate something specific. The exact visual design is open — what matters is that they're distinguishable at a glance.
Idle — minimal and unobtrusive. Small enough to sit at the screen edge without competing with whatever you're working on.
Hover — reveals what you can do: the microphone as the primary action, and the hotkey named somewhere visible so the shortcut is discoverable without hunting for it.
Listening — unmistakably live. Something that responds to your voice in real time, so you can tell it's actually hearing you rather than sitting there frozen. Cancel and confirm both reachable directly.
Moving — the three dock positions shown as targets so you can see where it will land before letting go, with the nearest one indicated.
Replying — a short summary beside the mascot, readable at a glance, opening toward the screen and never off the edge: rightward when docked left, leftward when docked right, upward when docked at the bottom.
Interaction
The hotkey is live only while the mascot is visible. Toggle the mascot off and the hotkey goes away — nothing to configure, and nothing left running in the background you forgot about.
Two ways to start talking: hold the hotkey and speak, releasing when done; or click the mascot to start and click again to stop. Either way, cancel and confirm are also reachable on the listening control — cancel discards the capture, confirm ends it and sends what was captured.
It's a real conversation. Back-and-forth works and it remembers the thread. It has the same capability as any chat in the app, including web search. Talking to the mascot shouldn't be a lesser experience than typing in the app.
Decisions to make
Worth knowing
Acceptance criteria
Docking and position
States
Activation
Conversation
Failure handling
Platform and quality
.github/workflows/ci-lite.yml).