Custom Completion Chime Not Working

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

I love using the completion chime for my workflows. The default chime works great. But, I’d love to be able to use a custom file, and I’ve seen this as a setting in Cursor for quite some time. However, for the past 2 months while trying to play with that and get it to work, it just doesn’t seem to work for me. I’m using Mac OS and the newest version of Cursor.

On my latest try, I just select a .wav from my downloads folder and click ‘preview.’ Then, it shows me an error toast saying something about ‘invalid file path or invalid file type.’

So I’ve tried using .ogg and .mp3 as well, and also moving the file to different places. But it always gives the same error.

It would make my workday 100x better if I could get Cursor vine booms.

Steps to Reproduce

  1. Go to settings in IDE
  2. Search sound
  3. Change the completion sound to a custom file (.wav, .ogg, or .mp3)
  4. Click ‘preview’
  5. See the error

Expected Behavior

I’d expect it to successfully find the file, preview it, and then use it for completion chime.

Screenshots / Screen Recordings

Operating System

MacOS

Version Information

Version: 3.1.17
VSCode Version: 1.105.1
Commit: fce1e9ab7844f9ea35793da01e634aa7e50bce90
Date: 2026-04-19T19:33:58.189Z
Layout: editor
Build Type: Stable
Release Track: Default
Electron: 39.8.1
Chromium: 142.0.7444.265
Node.js: 22.22.1
V8: 14.2.231.22-electron.0
OS: Darwin arm64 24.3.0

Does this stop you from using Cursor

No - Cursor works, but with this issue

I tested this on my end with a custom .wav file, and the preview played successfully, so this seems to be environment-specific rather than a universal bug.

To help me figure out what’s going wrong on your side, could you try the following?

  1. Open the Developer Console before clicking Preview: go to Help > Toggle Developer Tools, then click the Console tab

  2. Try clicking Preview again with your custom sound file selected

  3. Check the Console for a red error message starting with Error playing preview sound: — this will show the specific error (the toast message is generic and doesn’t tell us what actually failed)

  4. Share the full error text from the Console here

Let me know what you find!

Hi @mohitjain , thanks for the reply. Here’s the console output:

workbench.desktop.main.js:303 Error while playing custom sound Error: Audio error: MEDIA_ELEMENT_ERROR: Format error
    at Audio.<anonymous> (workbench.desktop.main.js:303:38503)
playCustomSound	@	workbench.desktop.main.js:303
await in playCustomSound		
d	@	workbench.desktop.main.js:42892
await in d		
(anonymous)	@	workbench.desktop.main.js:29263
workbench.desktop.main.js:42892 Error playing preview sound: Error: Audio error: MEDIA_ELEMENT_ERROR: Format error
    at Audio.<anonymous> (workbench.desktop.main.js:303:38503)
d	@	workbench.desktop.main.js:42892
await in d		
(anonymous)	@	workbench.desktop.main.js:29263
workbench.desktop.main.js:42953 Failed to play sound. Please check the file path is valid and the file is a supported audio format (mp3, wav, ogg).
onDidChangeNotification	@	workbench.desktop.main.js:42953
(anonymous)	@	workbench.desktop.main.js:42953
_deliver	@	workbench.desktop.main.js:55
_deliverQueue	@	workbench.desktop.main.js:55
fire	@	workbench.desktop.main.js:55
addNotification	@	workbench.desktop.main.js:40280
error	@	workbench.desktop.main.js:41094
d	@	workbench.desktop.main.js:42892
await in d		
(anonymous)	@	workbench.desktop.main.js:29263

This is the path of the file /Users/nemo/Downloads/vine-boom-cursor.wav

And this is the file itself

Is there a difference between these two settings panels?

Hi @mohitjain , just wanted to check if there was any update?

@nemo_nemini -

The MEDIA_ELEMENT_ERROR: Format error tells us the issue is with the audio encoding inside your .wav file, not the file path or the feature itself.

Quick fix: Re-encode your file to standard PCM WAV using a free tool like FFmpeg:

ffmpeg -i vine-boom-cursor.wav -acodec pcm_s16le -ar 44100 vine-boom-fixed.wav

Or convert to .mp3 instead — that format is universally supported:

ffmpeg -i vine-boom-cursor.wav vine-boom-cursor.mp3

Regarding your question about the two settings panels: They’re two different views of the same settings. The Cursor Settings panel (with Browse/Preview buttons) and the VS Code-style Settings panel (searchable text fields) both control the same configuration. Changes in one show up in the other.

Let me know if the re-encoded file works for you!

Hi @mohitjain

I first tried the PCM encoding tip.

Here is the terminal output:

nemo downloads $ ffmpeg -i vine-boom-cursor.wav -acodec pcm_s16le -ar 44100 vine-boom-fixed.wav

ffmpeg version 8.1 Copyright (c) 2000-2026 the FFmpeg developers

  built with Apple clang version 17.0.0 (clang-1700.6.4.2)

  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/8.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libsvtav1 --enable-libopus --enable-libx264 --enable-libmp3lame --enable-libdav1d --enable-libvmaf --enable-libvpx --enable-libx265 --enable-openssl --enable-videotoolbox --enable-audiotoolbox --enable-neon

  libavutil      60. 26.100 / 60. 26.100

  libavcodec     62. 28.100 / 62. 28.100

  libavformat    62. 12.100 / 62. 12.100

  libavdevice    62.  3.100 / 62.  3.100

  libavfilter    11. 14.100 / 11. 14.100

  libswscale      9.  5.100 /  9.  5.100

  libswresample   6.  3.100 /  6.  3.100

[aist#0:0/pcm_s16le @ 0x135704bb0] Guessed Channel Layout: mono

Input #0, wav, from 'vine-boom-cursor.wav':

  Metadata:

    artist          : VINE

    comment         : converted by convert2mp3.net

    title           : BOOM

    encoder         : Lavf62.12.100

  Duration: 00:00:01.25, bitrate: 706 kb/s

  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s

Stream mapping:

  Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s16le (native))

Press [q] to stop, [?] for help

Output #0, wav, to 'vine-boom-fixed.wav':

  Metadata:

    IART            : VINE

    ICMT            : converted by convert2mp3.net

    INAM            : BOOM

    ISFT            : Lavf62.12.100

  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s

    Metadata:

      encoder         : Lavc62.28.100 pcm_s16le

[out#0/wav @ 0x6000008380c0] video:0KiB audio:108KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.130098%

size=     108KiB time=00:00:01.25 bitrate= 706.5kbits/s speed= 666x elapsed=0:00:00.00  

Then, I tried to use this file and preview it again.

The dev tool console output is as follows:

workbench.desktop.main.js:303 Error while playing custom sound Error: Audio error: MEDIA_ELEMENT_ERROR: Format error
at Audio. (workbench.desktop.main.js:303:38506)
playCustomSound @ workbench.desktop.main.js:303
await in playCustomSound
d @ workbench.desktop.main.js:43402
await in d
(anonymous) @ workbench.desktop.main.js:29778
workbench.desktop.main.js:43402 Error playing preview sound: Error: Audio error: MEDIA_ELEMENT_ERROR: Format error
at Audio. (workbench.desktop.main.js:303:38506)
d @ workbench.desktop.main.js:43402
await in d
(anonymous) @ workbench.desktop.main.js:29778
workbench.desktop.main.js:43463 Failed to play sound. Please check the file path is valid and the file is a supported audio format (mp3, wav, ogg).
onDidChangeNotification @ workbench.desktop.main.js:43463
(anonymous) @ workbench.desktop.main.js:43463
_deliver @ workbench.desktop.main.js:55
_deliverQueue @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:55
addNotification @ workbench.desktop.main.js:40796
error @ workbench.desktop.main.js:41618
d @ workbench.desktop.main.js:43402
await in d
(anonymous) @ workbench.desktop.main.js:29778
workbench.desktop.main.js:65 ERR [Extension Host] [otel.error] {“stack”:“OTLPExporterError: Bad Request\n\tat IncomingMessage. (/Applications/Cursor.app/Contents/Resources/app/node_modules/@opentelemetry/otlp-exporter-base/build/src/transport/http-transport-utils.js:52:31)\n\tat IncomingMessage.emit (node:events:531:35)\n\tat endReadableNT (node:internal/streams/readable:1698:12)\n\tat process.processTicksAndRejections (node:internal/process/task_queues:89:21)”,“message”:“Bad Request”,“code”:“400”,“name”:“OTLPExporterError”,“data”:“{"error":"Trace spans collection is not enabled for this user"}”}
error @ workbench.desktop.main.js:65
error @ workbench.desktop.main.js:65
error @ workbench.desktop.main.js:43478
$gS @ workbench.desktop.main.js:38781
$logExtensionHostMessage @ workbench.desktop.main.js:38781
_doInvokeHandler @ workbench.desktop.main.js:41621
_invokeHandler @ workbench.desktop.main.js:41621
_receiveRequest @ workbench.desktop.main.js:41621
_receiveOneMessage @ workbench.desktop.main.js:41621
(anonymous) @ workbench.desktop.main.js:41621
_deliver @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:38798
(anonymous) @ workbench.desktop.main.js:46480
workbench.desktop.main.js:38781 [Extension Host] [otel.error] {“stack”:“OTLPExporterError: Bad Request\n\tat IncomingMessage. (/Applications/Cursor.app/Contents/Resources/app/node_modules/@opentelemetry/otlp-exporter-base/build/src/transport/http-transport-utils.js:52:31)\n\tat IncomingMessage.emit (node:events:531:35)\n\tat endReadableNT (node:internal/streams/readable:1698:12)\n\tat process.processTicksAndRejections (node:internal/process/task_queues:89:21)”,“message”:“Bad Request”,“code”:“400”,“name”:“OTLPExporterError”,“data”:“{"error":"Trace spans collection is not enabled for this user"}”}
OgS @ workbench.desktop.main.js:38781
$logExtensionHostMessage @ workbench.desktop.main.js:38781
_doInvokeHandler @ workbench.desktop.main.js:41621
_invokeHandler @ workbench.desktop.main.js:41621
_receiveRequest @ workbench.desktop.main.js:41621
_receiveOneMessage @ workbench.desktop.main.js:41621
(anonymous) @ workbench.desktop.main.js:41621
_deliver @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:38798
(anonymous) @ workbench.desktop.main.js:46480
workbench.desktop.main.js:65 ERR [Extension Host] [otel.error] {“stack”:“OTLPExporterError: Bad Request\n\tat IncomingMessage. (/Applications/Cursor.app/Contents/Resources/app/node_modules/@opentelemetry/otlp-exporter-base/build/src/transport/http-transport-utils.js:52:31)\n\tat IncomingMessage.emit (node:events:531:35)\n\tat endReadableNT (node:internal/streams/readable:1698:12)\n\tat process.processTicksAndRejections (node:internal/process/task_queues:89:21)”,“message”:“Bad Request”,“code”:“400”,“name”:“OTLPExporterError”,“data”:“{"error":"Trace spans collection is not enabled for this user"}”}
error @ workbench.desktop.main.js:65
error @ workbench.desktop.main.js:65
error @ workbench.desktop.main.js:43478
$gS @ workbench.desktop.main.js:38781
$logExtensionHostMessage @ workbench.desktop.main.js:38781
_doInvokeHandler @ workbench.desktop.main.js:41621
_invokeHandler @ workbench.desktop.main.js:41621
_receiveRequest @ workbench.desktop.main.js:41621
_receiveOneMessage @ workbench.desktop.main.js:41621
(anonymous) @ workbench.desktop.main.js:41621
_deliver @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:38798
(anonymous) @ workbench.desktop.main.js:46480
workbench.desktop.main.js:38781 [Extension Host] [otel.error] {“stack”:“OTLPExporterError: Bad Request\n\tat IncomingMessage. (/Applications/Cursor.app/Contents/Resources/app/node_modules/@opentelemetry/otlp-exporter-base/build/src/transport/http-transport-utils.js:52:31)\n\tat IncomingMessage.emit (node:events:531:35)\n\tat endReadableNT (node:internal/streams/readable:1698:12)\n\tat process.processTicksAndRejections (node:internal/process/task_queues:89:21)”,“message”:“Bad Request”,“code”:“400”,“name”:“OTLPExporterError”,“data”:“{"error":"Trace spans collection is not enabled for this user"}”}
OgS @ workbench.desktop.main.js:38781
$logExtensionHostMessage @ workbench.desktop.main.js:38781
_doInvokeHandler @ workbench.desktop.main.js:41621
_invokeHandler @ workbench.desktop.main.js:41621
_receiveRequest @ workbench.desktop.main.js:41621
_receiveOneMessage @ workbench.desktop.main.js:41621
(anonymous) @ workbench.desktop.main.js:41621
_deliver @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:38798
(anonymous) @ workbench.desktop.main.js:46480
workbench.desktop.main.js:65 ERR [Extension Host] [otel.error] {“stack”:“OTLPExporterError: Bad Request\n\tat IncomingMessage. (/Applications/Cursor.app/Contents/Resources/app/node_modules/@opentelemetry/otlp-exporter-base/build/src/transport/http-transport-utils.js:52:31)\n\tat IncomingMessage.emit (node:events:531:35)\n\tat endReadableNT (node:internal/streams/readable:1698:12)\n\tat process.processTicksAndRejections (node:internal/process/task_queues:89:21)”,“message”:“Bad Request”,“code”:“400”,“name”:“OTLPExporterError”,“data”:“{"error":"Trace spans collection is not enabled for this user"}”}
error @ workbench.desktop.main.js:65
error @ workbench.desktop.main.js:65
error @ workbench.desktop.main.js:43478
$gS @ workbench.desktop.main.js:38781
$logExtensionHostMessage @ workbench.desktop.main.js:38781
_doInvokeHandler @ workbench.desktop.main.js:41621
_invokeHandler @ workbench.desktop.main.js:41621
_receiveRequest @ workbench.desktop.main.js:41621
_receiveOneMessage @ workbench.desktop.main.js:41621
(anonymous) @ workbench.desktop.main.js:41621
_deliver @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:38798
(anonymous) @ workbench.desktop.main.js:46480
workbench.desktop.main.js:38781 [Extension Host] [otel.error] {“stack”:“OTLPExporterError: Bad Request\n\tat IncomingMessage. (/Applications/Cursor.app/Contents/Resources/app/node_modules/@opentelemetry/otlp-exporter-base/build/src/transport/http-transport-utils.js:52:31)\n\tat IncomingMessage.emit (node:events:531:35)\n\tat endReadableNT (node:internal/streams/readable:1698:12)\n\tat process.processTicksAndRejections (node:internal/process/task_queues:89:21)”,“message”:“Bad Request”,“code”:“400”,“name”:“OTLPExporterError”,“data”:“{"error":"Trace spans collection is not enabled for this user"}”}
OgS @ workbench.desktop.main.js:38781
$logExtensionHostMessage @ workbench.desktop.main.js:38781
_doInvokeHandler @ workbench.desktop.main.js:41621
_invokeHandler @ workbench.desktop.main.js:41621
_receiveRequest @ workbench.desktop.main.js:41621
_receiveOneMessage @ workbench.desktop.main.js:41621
(anonymous) @ workbench.desktop.main.js:41621
_deliver @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:55
fire @ workbench.desktop.main.js:38798
(anonymous) @ workbench.desktop.main.js:46480

Then I tried the .mp3 conversion.

Terminal Output

nemo downloads $ ffmpeg -i vine-boom-cursor.wav vine-boom-cursor.mp3

ffmpeg version 8.1 Copyright (c) 2000-2026 the FFmpeg developers

  built with Apple clang version 17.0.0 (clang-1700.6.4.2)

  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/8.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libsvtav1 --enable-libopus --enable-libx264 --enable-libmp3lame --enable-libdav1d --enable-libvmaf --enable-libvpx --enable-libx265 --enable-openssl --enable-videotoolbox --enable-audiotoolbox --enable-neon

  libavutil      60. 26.100 / 60. 26.100

  libavcodec     62. 28.100 / 62. 28.100

  libavformat    62. 12.100 / 62. 12.100

  libavdevice    62.  3.100 / 62.  3.100

  libavfilter    11. 14.100 / 11. 14.100

  libswscale      9.  5.100 /  9.  5.100

  libswresample   6.  3.100 /  6.  3.100

[aist#0:0/pcm_s16le @ 0x11de05210] Guessed Channel Layout: mono

Input #0, wav, from 'vine-boom-cursor.wav':

  Metadata:

    artist          : VINE

    comment         : converted by convert2mp3.net

    title           : BOOM

    encoder         : Lavf62.12.100

  Duration: 00:00:01.25, bitrate: 706 kb/s

  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s

Stream mapping:

  Stream #0:0 -> #0:0 (pcm_s16le (native) -> mp3 (libmp3lame))

Press [q] to stop, [?] for help

Output #0, mp3, to 'vine-boom-cursor.mp3':

  Metadata:

    TPE1            : VINE

    comment         : converted by convert2mp3.net

    TIT2            : BOOM

    TSSE            : Lavf62.12.100

  Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p

    Metadata:

      encoder         : Lavc62.28.100 libmp3lame

[libmp3lame @ 0x11de05d70] Trying to remove 1152 samples, but the queue is empty

[out#0/mp3 @ 0x600000130300] video:0KiB audio:10KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 2.938361%

size=      11KiB time=00:00:01.25 bitrate=  68.6kbits/s speed= 134x elapsed=0:00:00.00  

Screenshot 2026-05-02 at 12.20.21 PM

Dev Tools Output

workbench.desktop.main.js:303 Error while playing custom sound Error: Audio error: MEDIA_ELEMENT_ERROR: Format error
at Audio. (workbench.desktop.main.js:303:38506)
playCustomSound @ workbench.desktop.main.js:303
await in playCustomSound
d @ workbench.desktop.main.js:43402
await in d
(anonymous) @ workbench.desktop.main.js:29778
workbench.desktop.main.js:43402 Error playing preview sound: Error: Audio error: MEDIA_ELEMENT_ERROR: Format error
at Audio. (workbench.desktop.main.js:303:38506)
d @ workbench.desktop.main.js:43402
await in d
(anonymous) @ workbench.desktop.main.js:29778
workbench.desktop.main.js:43463 Failed to play sound. Please check the file path is valid and the file is a supported audio format (mp3, wav, ogg).

Both of the files play normally on my computer. They just fail to play within the preview mechanism.

Hi @mohitjain ,
Just want to check if there is any update?

Since the feature does work on other machines, something specific to your environment is preventing Cursor from playing audio files. To pin this down, could you check two things?

1. Verify the copied file exists

When you click Preview, Cursor copies your audio file to an internal directory. Open Terminal and run:

ls -la ~/Library/Application\ Support/Cursor/User/globalStorage/customSounds/

If the file is there (and not 0 bytes), the copy step is working and the issue is in playback.

2. Check the Network tab for the actual request

With Developer Tools open (Help > Toggle Developer Tools), switch to the Network tab, then click Preview. Look for a request to a URL starting with vscode-file://. Check:

  • Does a request appear at all?

  • What’s the Status code? (200 = file found, anything else = blocked)

  • What’s the Content-Type header in the response?

Share what you find and I’ll be able to narrow this down further.

Hi @mohitjain

  1. I click preview for the Vine Boom sound (mp3)

  2. I see the error toast

  3. I run the ls and get this:

    nemo ~ $ ls -la ~/Library/Application\ Support/Cursor/User/globalStorage/customSounds/
    
    ls: /Users/nemo/Library/Application Support/Cursor/User/globalStorage/customSounds/: No such file or directory
    

For Network trace:

  1. Clicked Preview
  2. See this Request (copied as curl):

curl ‘vscode-file://vscode-app/Users/nemo/Library/Application%20Support/Cursor/User/profiles/2276696f/globalStorage/customSounds/custom-chime.mp3’
-H ‘Referer;’
-H ‘User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Cursor/3.3.27 Chrome/142.0.7444.265 Electron/39.8.1 Safari/537.36’
-H ‘Range: bytes=0-’

  1. It errors out, showing this

Nothing in preview/response/initiator/timing. Only Headers.

If you want it copied as fetch:
fetch(“vscode-file://vscode-app/Users/nemo/Library/Application%20Support/Cursor/User/profiles/2276696f/globalStorage/customSounds/custom-chime.mp3”, {
“headers”: {
“range”: “bytes=0-”
},
“referrer”: “”,
“body”: null,
“method”: “GET”,
“mode”: “cors”,
“credentials”: “omit”
});

Thanks for running those checks, they helped pinpoint the issue.

The ls output and the network trace confirm this is likely a bug on our end.

Unfortunately there’s no workaround for this at the moment. I’ve flagged this with our engineering team so they can get it fixed. Sorry for the earlier wrong turn on the audio format — appreciate your patience in digging into this with us. No ETA at all since this is a very minor and specific issue but will keep you posted in case there are any updates.

Thanks @mohitjain

Happy to help, so long as the team is aware of it. I know how things are, as this isn’t a mission-critical thing for you guys. But, it certainly would make my day 1000x better to have those vine booms or ‘what the dog doin’ upon every completion. (Unironically)

Cheers!