I spend a lot of hours working with cursor and it would be so wonderful if I could have an audible alert or a text message alert when the current process is finished i’m working on a large app and a lot of times my requests take several minutes to complete and with the audible alert I could know when the processing is done and not have to be staring at the cursor chat the whole time. Thanks for the AMAZING app!
Agreed. I usually enjoying youtube while coding with cursor.
I have an idea, when cursor answer end, it play a sound just like a phone notify.
Agreed.
Excellent idea! Sometimes I do physical exercise while Cursor work on a big feature and I have to check regularly to see if the request is over. (vibe coding is cool buy have you tried sport coding ?)
+1 upvote for this feature
Yes, please add a simple noise audible whenever it’s either finished with its results or needs developer input.
Agreed, I submitted a feature request similar to this and was informed that someone else had already requested it. Let’s vote for this post to show our support, and hopefully, this feature will be added in the next version. It would be extremely helpful for us.
Hi there, I also looked for the same thing and I created a simple MCP server to handle this. neo-mcps/servers/sound-notification at main · neotanx/neo-mcps · GitHub
Hope it helps! It’s only tested on Mac and you can adjust it on your need Cheers!
I was about to post this feature request myself, that’s how I got here.
I would add that I work in coworking places where an audio alert would be disruptive. It would be great if it could trigger some event that could be seen by other processes on the system, since I would want to do other work away from the Cursor editor while waiting. It could even be as simple as creating a file of known name while the AI model is working and deleting it when done (or the reverse).
Here is a Claude AI session containing a Mac OS script that will flash the screen with ~/alfred-e-neuman.jpeg whenever the control file /tmp/trigger_file.txt is created (see https://claude.ai/public/artifacts/9020e347-cd38-4f79-a3b5-c3390421843c) (you may need to brew install fswatch
):
#!/bin/bash
FILE_TO_WATCH="/tmp/trigger_file.txt"
FLASH_IMAGE="$HOME/alfred-e-neuman.jpeg"
flash_screen() {
# Convert the image path to absolute path
local abs_flash_image
abs_flash_image=$(realpath "$FLASH_IMAGE" 2>/dev/null)
# Create a temporary Swift script for fullscreen flash
local temp_script="/tmp/flash_screen.swift"
if [[ -f "$abs_flash_image" ]]; then
# Flash with image
cat > "$temp_script" << 'SWIFT_EOF'
import Cocoa
let app = NSApplication.shared
let window = NSWindow(
contentRect: NSScreen.main!.frame,
styleMask: [.borderless],
backing: .buffered,
defer: false
)
window.backgroundColor = NSColor.white
window.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.maximumWindow)))
window.isOpaque = true
window.ignoresMouseEvents = true
if let imagePath = CommandLine.arguments.count > 1 ? CommandLine.arguments[1] : nil,
let image = NSImage(contentsOfFile: imagePath) {
let imageView = NSImageView(frame: window.contentView!.bounds)
imageView.image = image
imageView.imageScaling = .scaleProportionallyUpOrDown
window.contentView?.addSubview(imageView)
}
window.makeKeyAndOrderFront(nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
window.close()
app.terminate(nil)
}
app.run()
SWIFT_EOF
swift "$temp_script" "$abs_flash_image" > /dev/null 2>&1 &
else
# Flash with white color
cat > "$temp_script" << 'SWIFT_EOF'
import Cocoa
let app = NSApplication.shared
let window = NSWindow(
contentRect: NSScreen.main!.frame,
styleMask: [.borderless],
backing: .buffered,
defer: false
)
window.backgroundColor = NSColor.white
window.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.maximumWindow)))
window.isOpaque = true
window.ignoresMouseEvents = true
window.makeKeyAndOrderFront(nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
window.close()
app.terminate(nil)
}
app.run()
SWIFT_EOF
swift "$temp_script" > /dev/null 2>&1 &
fi
# Clean up after a moment
sleep 0.5
rm -f "$temp_script"
}
# Create the directory for the file if it doesn't exist
mkdir -p "$(dirname "$FILE_TO_WATCH")"
# Create the file if it doesn't exist (fswatch needs it to exist)
touch "$FILE_TO_WATCH"
echo "Watching for changes to: $FILE_TO_WATCH"
echo "Flash image: $FLASH_IMAGE"
echo "Press Ctrl+C to stop..."
# Use fswatch with event flags to get detailed event information
fswatch -l 0.01 --event-flags "$(dirname "$FILE_TO_WATCH")" | while read event_line
do
# Only process events for our specific file
if [[ "$event_line" == *"$(basename "$FILE_TO_WATCH")"* ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Raw event flags: $event_line"
# Check for creation events (Created, ItemCreated)
if [[ "$event_line" == *"Created"* ]]; then
echo "File CREATED"
flash_screen
# Check for deletion events (Removed, ItemRemoved)
elif [[ "$event_line" == *"Removed"* ]]; then
echo "File DELETED"
# flash_screen
# Check for modification events (Updated, Modified, Changed)
elif [[ "$event_line" == *"Updated"* || "$event_line" == *"Modified"* || "$event_line" == *"Changed"* ]]; then
echo "File MODIFIED"
# flash_screen
else
echo "UNKNOWN EVENT TYPE - Event flags: '$event_line'"
echo "Debug: Looking for file '$(basename "$FILE_TO_WATCH")' in event"
# Flash anyway for testing
# flash_screen
fi
else
# Debug: show all events to understand what we're getting
echo "$(date '+%Y-%m-%d %H:%M:%S') - Other file event: $event_line"
fi
done