Skip to content

Push-to-talk: hold the mic / floating button to record, release to send #235

Description

@DevEmperor

Idea

Today the mic button (keyboard) and the floating button are tap-to-toggle: tap once to start recording, tap again to stop + send. Add an opt-in "push-to-talk" (hold-to-record) mode: press and hold to record, release to stop and send — the walkie-talkie feel.

Inspired by the desktop app Handy, which offers both push-to-talk and toggle.

Why

  • Faster for short, one-off dictations — no second tap to stop.
  • Harder to accidentally leave recording running (ties into the "mic kept open" reports, Microphone kept open for a long period of time. #147): you physically hold to record, so letting go always stops it.
  • Familiar interaction (voice-message style).

Proposed behavior

A setting (default off) — e.g. "Hold to record" — that, when on, switches the primary dictation trigger to hold-to-record:

  • Keyboard mic key: hold to record, release → stop + transcribe.
  • Floating button: press and hold to record, release → stop + transcribe (inject).
  • A very short hold (below the touch-slop / long-press threshold) could still fall back to a normal tap-toggle so a quick tap isn't lost — TBD.

Key design consideration: long-press already does things

The mic already has long-press gestures, so "hold" is overloaded and needs a clear resolution when push-to-talk is on:

Options to resolve the conflict (pick one in implementation):

  1. When push-to-talk is on, hold = record, and the above long-press shortcuts are disabled or moved to another gesture (e.g. double-tap) while the mode is active.
  2. Keep push-to-talk as a separate gesture/affordance and leave tap-toggle + long-press as they are.

Option 1 is probably the cleaner mental model (one primary gesture), but it removes the existing hold-shortcuts in that mode — worth deciding deliberately.

Scope / notes

  • Reuse the existing recording pipeline (onMicClick / startRecording / stopAndTranscribe); this is purely an input-gesture change.
  • Not for realtime/streaming or long-form segmented, where "hold" doesn't map cleanly — those keep their current behavior (mirrors how the send-with-local shortcut is gated).
  • Applies to the classic/legacy dictation layout too.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions