Audio attachments: add playback speed control, and allow HTTP(S) audio sources (not just local files)

Open 💬 0 comments Opened Aug 13, 2026 by vltansky

What variant of Codex are you using?

App (macOS desktop); also relevant to the CLI / input protocol (codex-cli 0.146.0)

What feature would you like to see?

I work with a lot of audio attachments in Codex (![](...) embeds render as an inline audio player). Two gaps make that workflow painful:

1. No playback speed control in the inline audio player

The player today has only: play/pause, a scrubber, elapsed/total time, and a menu:

♪  growing-live.mp3
   MP3 audio                          ▶  …
   ●──────────────────────  0:00 / 1:32

There is no way to speed the audio up or slow it down. Listening back to long recordings, meeting captures, or generated audio at 1× only is slow, and for reviewing many clips in a row it's the single biggest time sink. Every other audio player I use daily (podcast apps, browser <video>/<audio> menus, Slack voice clips, YouTube) offers this.

Requested:

  • A speed control on the player — at minimum / 1.25× / 1.5× / 1.75× / , ideally 0.5×.
  • Put it in the existing menu if the inline player is too small for a dedicated button.
  • Remember the last selected speed across clips and across sessions, so a whole review pass doesn't require re-selecting it per file.
  • While there: ±10s skip and a keyboard shortcut for play/pause would round it out.

2. Audio sources are local-file only — please allow HTTP(S) URLs

Today audio input has to be a local file. In the code, UserInput::LocalAudio { path } is read off disk and inlined as a base64 data: URL (codex-rs/protocol/src/local_media.rs), and the code-mode docs state it outright: "audio_url should be a base64-encoded data: URL" (codex-rs/code-mode-protocol/src/description.rs). Nothing accepts https://…/clip.mp3.

I tested this explicitly with two HTTP audio endpoints, and Codex made no request to either one — the reference is simply never fetched.

Requested:

  • Accept http(s) URLs wherever a local audio file is accepted today: ![](https://example.com/clip.mp3) in a message, attachments, and the audio input in the protocol/SDK.
  • Fetch and render remote audio in the inline player (streaming rather than fully downloading, where possible).
  • Keep it bounded and predictable: honor the existing 50 MB audio cap, enforce a content-type check and a timeout, and surface a clear error when a fetch fails instead of silently rendering a dead player.
  • If fetching remote media needs to stay opt-in for network/safety reasons, gate it behind a config flag rather than dropping the URL.

Why it matters: audio I want Codex to work with usually already lives behind a URL (recording services, object storage, CI artifacts, shared links). Having to download every clip to disk first, purely to hand it to Codex, is friction with no upside — and once it's inlined as a data URL it also bloats the conversation.

Additional information

Related but distinct:

  • #21645 — read-aloud / replay button for assistant responses (text-to-speech output, not playback controls for attached audio files).
  • #33932 — forwarding audio inputs to the Responses API (closed); this request is about the sources accepted and the player UI.

Happy to add the screenshot of the current player and the exact HTTP test setup in a comment if useful.

View original on GitHub ↗