[App] Add Insert/Send mode for desktop dictation hotkeys (no Codex Micro required)

Open 💬 2 comments Opened Aug 9, 2026 by daeshawnballard
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

Reviewer decision requested

Please choose one outcome for this Desktop behavior contract:

  • Accept: invite or port the private Desktop implementation.
  • Adjust: identify the behavior, copy, or safety constraint to change.
  • Decline: close the proposal without requiring an implementation review.

A proposal-only commit and visual are ready to port, but upstream PR creation is permission-gated by the repository's invitation-only contribution policy. This issue is therefore structured as the review surface.

What

Add an After transcription setting for both Desktop dictation hotkeys:

  • Insert (default) — transcribe into the Codex composer without submitting.
  • Send — transcribe and submit a successful, non-empty transcript through the ordinary composer path.

After Send, the existing Queue/Steer preference remains authoritative. Dictation targeting another application always remains insert-only; this feature must never synthesize Enter or submit an external form or message.

Why

Voice-first workflows currently require a manual send action after every hotkey transcription. Keeping Insert as the default preserves today's review-first workflow, while Send removes that repeated action for users who explicitly opt in.

Proposed settings UI

!Codex Desktop Dictation settings with a new After transcription Insert or Send control

The mockup selects Send to make the new state visible; the shipped default should be Insert.

Behavior contract

| Context | Setting | Result |
| --- | --- | --- |
| Cursor is outside Codex | Either | Insert transcript at the cursor; never submit |
| Codex composer | Insert | Insert transcript and keep the draft editable |
| Codex composer, no active turn | Send | Submit through the standard composer path and start a turn |
| Codex composer, active turn | Send + Queue | Submit normally and queue the prompt |
| Codex composer, active turn | Send + Steer | Submit normally and steer the active turn |
| Empty, cancelled, or failed transcription | Either | Do not insert or send |

flowchart LR
    H["Dictation hotkey stops"] --> T["Transcription succeeds"]
    T --> A{"Codex composer?"}
    A -- "No" --> I["Insert only"]
    A -- "Yes" --> P{"After transcription"}
    P -- "Insert (default)" --> I
    P -- "Send" --> S["Standard composer submit"]
    S --> R{"Turn running?"}
    R -- "No" --> Start["Start turn"]
    R -- "Yes + Queue" --> Queue["Queue prompt"]
    R -- "Yes + Steer" --> Steer["Steer active turn"]

How

The shipped app already exposes separate Stop dictation and Transcribe and send actions. The in-app hotkey completion path currently selects the insert action. The smallest private Desktop change is to persist one app-owned preference and choose the existing completion action at that boundary:

const action =
  target.kind === "codex-composer"
    ? settings.dictationHotkeyCompletion
    : "insert";

stopDictation(action);

The preference should stay in the existing opaque desktop.* namespace, defaulting to "insert". No new app-server setting type or turn/queue RPC is needed. Send should invoke the same composer submission function as the send button so draft handling, Queue/Steer routing, accessibility behavior, analytics, and dictation submit-source metadata do not fork.

Acceptance tests

  • An absent preference resolves to Insert; both values persist across restart.
  • Hold-to-dictate and toggle dictation honor the selected action exactly once per recording session.
  • Insert leaves the Codex transcript editable.
  • Send starts a turn while idle and follows Queue/Steer during an active turn.
  • Dictation targeting another application always inserts and never submits.
  • Empty, cancelled, failed, and retried transcriptions never cause a send.
  • Existing composer content is handled identically to a send-button submission.

Risks and non-goals

  • Defaulting to Insert prevents a migration surprise.
  • External targets fail closed to insert, preventing accidental submission.
  • One terminal action per recording session prevents duplicate sends.
  • Voice chat is unchanged.
  • Transcription-engine latency is a separate concern; this proposal changes completion behavior only.

Related issue

#37321 requests send-on-release for Codex Micro push-to-talk. This proposal is broader: it covers both Desktop hold/toggle dictation hotkeys, makes Insert/Send an explicit setting, preserves Queue/Steer routing, and defines external-app safety. The two can share the same underlying composer submission behavior without treating either report as redundant.

cc @thsottiaux

View original on GitHub ↗

2 Comments

github-actions[bot] contributor · 18 days ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #37321

Powered by Codex Action

daeshawnballard · 16 days ago

This is related to #37321, but it is not a duplicate.

  • #37321: Codex Micro hardware; hold and release the Micro microphone button to transcribe and send.
  • #37705: the standard Codex Desktop hold-to-dictate and toggle-dictation hotkeys; no Codex Micro device is required.

#37705 also proposes a persisted Insert / Send setting, routes Send through the normal composer so Queue/Steer remains authoritative, and keeps dictation into non-Codex applications insert-only for safety.

The Micro flow may be able to reuse the same underlying composer submission behavior, but implementing #37321 alone would not add this mode to the normal Desktop dictation hotkeys.