[App] Add Insert/Send mode for desktop dictation hotkeys (no Codex Micro required)
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.
- Proposal commit: daeshawnballard/codex@bcfef48
- Full design packet: behavior matrix, flow, implementation sketch, and tests
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
2 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
This is related to #37321, but it is not a duplicate.
#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.