Skip to content

Talk to the floating mascot — hotkey or click to speak, and it listens, thinks, and replies #5425

Description

@graycyrus

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

  • The mascot rests only at left centre, right centre, or bottom centre — never anywhere else.
  • Moving it settles it into the nearest of the three rather than leaving it where it was dropped.
  • While moving, the three positions appear as targets and the nearest one is indicated.
  • The chosen position survives quitting and reopening the app.
  • A fresh install starts in a defined one of the three.
  • The mascot stays clear of the system menu bar and Dock rather than sitting underneath them.
  • Changing resolution, or unplugging or adding a display, leaves the mascot in a valid on-screen position rather than stranded off-screen.

States

  • Idle is minimal and unobtrusive at the docked edge.
  • Hovering reveals the microphone action and names the hotkey.
  • While listening, something responds to the voice in real time.
  • The five states — idle, hover, listening, moving, replying — are each distinguishable at a glance.

Activation

  • With the mascot hidden, the hotkey does nothing at all.
  • With the mascot visible, holding the hotkey starts listening and releasing it stops.
  • Clicking the mascot starts listening, and clicking again stops it.
  • Moving the mascot never accidentally triggers listening.
  • Cancel discards the capture and sends nothing.
  • Confirm ends the capture and sends what was captured.
  • Activating while already listening does not start a second capture.

Conversation

  • The reply appears beside the mascot as a short summary.
  • The summary opens toward the screen and is never cut off by the screen edge, in all three positions.
  • Follow-up questions work — it's a conversation, not one-shot questions.
  • Anything doable in a normal app chat is doable by talking to the mascot, including web search.
  • A reply too long to summarise gives a way to read it in full.

Failure handling

  • Denied or unavailable microphone access is explained rather than failing silently.
  • A failure to transcribe, or to reach the network, surfaces on the mascot rather than leaving it stuck mid-state.
  • Nothing leaves the mascot permanently stuck in listening.

Platform and quality

  • Behaviour on Windows and Linux is unchanged and nothing regresses there.
  • All new text is translated into every language the app supports.
  • Tests cover the docking rules, the activation paths, and the failure cases above.
  • Diff coverage ≥ 80% — the implementing PR meets the changed-lines coverage gate (Vitest + cargo-llvm-cov, enforced by .github/workflows/ci-lite.yml).

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureNet-new user-facing capability or product behavior.priority: highBreaks a specific featurereact-uiReact app work in app/src: pages, components, providers, store, and UX.tauri-shellDesktop host work in app/src-tauri: windowing, relay, sidecar lifecycle.voiceVoice features and audio workflows in src/openhuman/voice/ and app/src/features/voice/.

    Type

    No type

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions