The slack-sounds GitHub scripts vs Chirpy: custom Slack sounds on a Mac
Two GitHub projects share the name slack-sounds, and they solve different problems. Sharon Brizinov's swaps one of Slack's own sound files inside its Electron disk cache, which gets you a single custom sound. The debaillie project runs a Slack bot that plays a different .wav for each channel. Both work as described. Each asks for something in return: one sound cut off near a second, or a bot in every channel and a Python process that has to stay up.
This page covers what each one does, where it stops, and what's left for a tool like Chirpy. All descriptions below are from the two READMEs as of August 2026; both projects are worth reading before you decide.
What Slack's own settings give you first
Before any script: Slack's desktop app does have a notification sound picker, and it's worth setting properly, because for some people that's the whole problem solved.
- Open Slack → Preferences → Notifications.
- Under Sound & appearance, choose your Notification sound and, separately, the sound for huddles and calls.
- For a specific channel, open the channel, click its name, and use Notifications to decide whether it notifies you at all — every message, mentions only, or nothing.
Limit: the sound picker is one choice for your whole account, and it only offers Slack's built-in sounds. Per-channel settings control whether you're notified, never what you hear. I checked again in August 2026; there's still no per-channel sound menu.
What the two slack-sounds repos actually do
They have a name in common and nothing else. The cache-swap script is a short shell-and-Python trick that edits data Slack has already downloaded. The bot is an application you register with Slack, with OAuth scopes and a token, that listens to messages over a websocket. One changes what Slack plays; the other plays sounds itself and leaves Slack muted.
That difference decides everything else on this page: what breaks on a Slack update, what your workspace admin has to approve, and whether you can tell #incidents apart from a reaction in a channel nobody reads.
The cache-swap script: replacing Slack's Hummus sound
Slack's notification sounds ship as audio files, and the desktop app keeps them in Electron's disk cache. The script locates the cache entry holding the Hummus sound and overwrites its bytes with your file. Slack keeps thinking it's playing Hummus. No patching, no code injection, no API call. The insight is that Slack's notification sound is data sitting in a cache, and a cache is writable by design. It's a good trick and a short read.
- Quit Slack entirely, so the cache isn't held open.
- Run the script, pointing it at the audio file you want.
- Relaunch Slack.
- In Slack, open Preferences → Notifications and select Hummus as your notification sound. Your file plays in its place.
Four steps, no account changes, nothing installed permanently. For one sound you actually want to hear, that's a good trade.
Limit: it's one sound. Hummus is a single slot, so every Slack notification that makes a noise makes the same noise. Per-channel isn't in scope, and the README doesn't claim it is.
Limit: playback stops near a second. Slack's own JavaScript caps how long a notification sound plays, so a longer clip is truncated wherever it happens to be. That's the source of most my custom Slack sound cuts off reports, and no version of the script can lift a cap that lives in Slack's code.
Limit: the edit is temporary. When Slack refreshes that cache or ships an update, the original bytes come back and you run the script again. A disk cache is designed to be refilled.
Limit: every change means quitting and relaunching Slack, which also means losing whatever call or thread you were in.
The bot approach: a per-channel Slack sound script
This project does reach real per-channel sounds, and it's the one that ranks for those queries. The route it takes is a Slack app you register in your workspace: a bot token with channels:history, channels:read, groups:history, and groups:read, Socket Mode turned on, both tokens in a .env, a .wav file per channel, and a Python process left running for as long as you want sounds. The bot then plays the file mapped to the channel a message arrived in.
Read that list as an ongoing commitment rather than an install. Every piece of it can stop working while you assume you're covered.
Limit: the bot hears only the channels it has been invited to. Each new channel is another invite and another .wav.
Limit: DMs and keyword matching are out of scope. The mapping is channel to file, so a direct message from your manager and a bot posting a deploy log sound identical if they land in channels you mapped the same way.
Limit: it reads channel history through Slack's API. channels:history lets the token read messages, so installing it is a workspace decision rather than a personal preference, and in a managed workspace an admin signs off.
Limit: it's a service you own. If the process exits, the laptop sleeps, or the socket drops, Slack is silent and nothing tells you why.
Chirpy sits on the other side of that last point. It never talks to Slack's API, holds no token, and has nothing to approve, because it reads the notification banner macOS already drew on your screen. If you want the shorter version of that story, the Slack notification guide covers what Slack's own settings do first.
Side by side: the scripts and Chirpy
| Capability | Cache-swap script | Slack bot | Chirpy |
|---|---|---|---|
| A different sound per channel | No | Yes | Yes |
| A different sound per person | No | No | Yes |
| Rules by keyword | No | No | Yes |
| Custom sound files | One file, in one slot | One .wav per channel | MP3, WAV, CAF, plus 72+ included |
| Survives a Slack update | No | Yes | Yes |
| Needs a Slack app your workspace approves | No | Yes | No |
| Runs without a process to babysit | Yes, the edit is static | No, a Python process stays up | No, it's a menu bar app |
| OS support | macOS | macOS, Windows, Linux | macOS 13 or later |
Where each script leaves you
The cache swap is a fun read and a fun hour: an ICQ uh-oh in the Hummus slot, trimmed under a second so the cap doesn't bite. It is also one sound for all of Slack, and it disappears at the next Slack update. The bot reaches per-channel audio and asks for a workspace app, a token that reads channel history, a bot invite per channel, and a process you keep alive. Both are worth understanding. Neither is something to depend on for the message you can't afford to miss. One platform note: Chirpy is macOS 13 or later, because the mechanism it uses is a macOS one.
Per-channel Slack sounds with Chirpy
Chirpy is a native Mac menu bar app that plays a chosen sound when a matching notification banner appears. It reads the text already visible in Notification Center banners through the macOS Accessibility API, matches it against rules stored on your Mac, and plays the sound attached to the most specific match. No Slack app, no token, no scopes, no channel invites, and no message content leaving the machine.
- Install Chirpy and grant Accessibility access. Download Chirpy, move it to Applications, and open it. macOS asks for Accessibility access so Chirpy can read the text of Notification Center banners. It never asks for Screen Recording, and it never signs in to Slack.
- Mute Slack's own notification sound. In Slack, open Preferences → Notifications and set the notification sound to None, or turn off Play sound for notifications for Slack in System Settings → Notifications. Otherwise you hear Slack's sound and yours together.
- Add a rule per channel, person, or keyword. Create a Chirpy rule for Slack, then narrow it to a channel name, a sender, or a phrase, and pick the sound. When several rules match one banner, the most specific rule plays.
Because it matches on banner text, the rules go past channels: a sound for your manager's name, a sound for the word production, a louder one for #incidents, and per-rule volume so the quiet ones stay quiet. The same rules work for Teams, Mail, Linear, or anything else that draws a banner, which is the set a per-app notification sound side of it. Chirpy costs $19.99 once, with a 3-day trial and no card, and a 30-day money-back guarantee. See what the licence covers.
One setup note: don't give all forty channels their own sound, or you rebuild the problem you started with. Two or three sounds, silence everywhere else, is the setup that survives a week.
Related, from either direction: per-channel Slack notification sounds, Slack sounds not playing at all, the sound library, and the other two DIY reads: what Apple Shortcuts can and can't do and Hammerspoon.
Frequently asked questions
Not through Slack's own settings, which only offer Slack's built-in sounds. The slack-sounds cache-swap script on GitHub replaces one built-in sound with your file. For a custom file per channel or person on a Mac, a rules app such as Chirpy plays your own MP3, WAV, or CAF.
Because Slack's own code stops the clip, not your file or the script. Notification sounds are meant to be short, so playback is capped near a second, and a longer file is truncated wherever it happens to be. Playing the sound outside Slack removes the cap.
No. Slack's desktop app has one notification sound setting for your account, and per-channel notification preferences control whether you're notified, not what you hear. Per-channel sounds need a bot that watches channels or a Mac app that reacts to the banner.
Usually, yes. The bot needs an app installed in your workspace with channels:history and groups:history scopes, and most workspaces require an admin to approve app installation. Reading channel history is an admin decision, not a personal setting.
Comparisons reflect publicly available information as of August 2026.