Skip to content

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

Description

@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:

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    appIssues related to the Codex desktop appenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions