Hammerspoon custom notification sounds on Mac, and what they cost you

Hammerspoon can't do this out of the box. The setting people find first changes the sound for notifications Hammerspoon itself sends, not for a banner from Slack or Mail. Reacting to another app's notification is possible only as a Lua config you write, debug, and keep working yourself.

That means learning a scripting framework, writing code against parts of macOS that Apple neither documents nor keeps stable, and owning it forever. Below is what that costs, and the two-minute version.

What a scripted setup involves

Hammerspoon is a Lua automation framework. It ships no notification-sound feature, so everything here is code you write. There are two ways for a script to hear about another app's notification, and neither is a setting you switch on.

The first listens for messages an app broadcasts to the rest of the system on purpose. Almost none of the apps that ping you do that, because a banner is interface drawn on screen rather than an announcement, so it never reaches Slack, Teams, Mail, or anything else in that list, and the channel is expensive and unreliable besides.

The second reads the banner through the macOS Accessibility layer, which is the layer Chirpy uses: the text already visible in a Notification Center banner, matched locally, with no private frameworks, no Slack API, no screen capture, and nothing leaving your Mac. Everything around it differs. In Chirpy that plumbing ships tested; in a script it's undocumented internal structure you reverse-engineer again after every macOS release.

Limit: there is no supported API for any of this, and nothing to hold Apple to the structure your script depends on.

Where the DIY route runs out

Getting a first sound to play is an evening. Keeping it playing is the part that doesn't end.

Limit: the element paths aren't API. Nothing obliges Apple to keep Notification Center's Accessibility tree the same shape, and a point release that moves the text one level deeper turns your working config into silence with no error in the console.

Limit: there's no rules UI. Adding a sound for one person means editing Lua and reloading, which is fine for you and a non-starter for anyone else on your Mac.

Limit: matching the app name is a substring test on whatever text happens to be in the element. Per-channel, per-sender, and keyword rules mean parsing that text yourself, including grouped banners, threads, reactions, and the app name turning up inside someone's message, then deciding which rule wins when two match.

Limit: there's no sound library. You're sourcing, trimming, and normalising audio files by hand, and per-rule volume is more code on top of that.

Limit: you're the maintainer now. Every macOS release is your regression test, and the failure mode is a silent one you might not notice for a week.

Hammerspoon vs Chirpy, row by row

CapabilityHammerspoonChirpy
Plays a sound for another app's notificationOnly if you write the code for itYes, out of the box
SetupLearn Lua, write a config file, debug it by handInstall, click, done in about two minutes
Rules for a channel, a sender, or a keywordYou write and maintain the text matching yourselfBuilt in, with the most specific rule winning
Rule list you can edit without codeNoYes
Sound libraryNone. You find and convert your own files72+ sounds, plus MP3, WAV, and CAF uploads
Survives macOS updatesBreaks, silently, and you debug it againKept working across releases as part of the app
Support if it stops workingYou are the supportEmail and I answer
Checked against the Hammerspoon API documentation, August 2026. Hammerspoon can reach every row in this table; the column says what it costs to get there.

The version that needs no code

Chirpy is a native Mac menu bar app that plays a chosen sound when a matching notification banner appears. Rules match an app, channel, sender, or keyword across the 118 apps in the notification guide directory, the most specific rule wins, and you pick from more than 72 sounds or your own files, with volume per rule. Accessibility access only, never Screen Recording, and no notification text leaves your Mac. Keeping it working across macOS releases is my job rather than yours.

$19.99 once, no subscription, free for 3 days without a card, 30 days to change your mind, macOS 13 or later. See what the licence covers.

Hammerspoon does window management and hotkeys. Chirpy runs alongside it and touches none of that.

The other scripting routes stop sooner: whether Apple Shortcuts can change notification sounds (it can't — there's no notification trigger on macOS), the slack-sounds scripts on GitHub (a cache hack and a per-channel bot, both narrow and both fragile), and per-channel Slack notification sounds if Slack is the only app you care about. For the general version of the problem, start with setting a per-app notification sound on Mac. Hammerspoon's own page in the directory has the short version: Hammerspoon notification sounds.

Frequently asked questions

Only if you write it yourself. Hammerspoon ships nothing for this: you'd write a Lua config that watches macOS internals for an arriving banner, reads its text, and plays a file. Chirpy does it as an installed app, with no code.

Not Slack's own sound, and not without code. You'd mute Slack's audio and write a script that plays your file when a Slack banner appears, then maintain that script. Chirpy is the same result as a setting rather than a project.

No. Scripted setups depend on internal macOS structures that Apple doesn't document or keep stable, so an update can stop your sounds without any error. You find out by missing the notification you built the whole thing for.

Not with Chirpy. Hammerspoon is a scripting framework, so anything it does for notifications is a Lua config you write and keep working. Chirpy is a menu bar app with a rule list, and a first rule takes about two minutes.

Comparisons reflect publicly available information as of August 2026.