Set your Slack status to the currently playing Spotify track. macOS only.
- Create a Slack app at https://api.slack.com/apps
- Add User Token Scopes:
users.profile:writeandusers.profile:read - Install to workspace and copy the User OAuth Token (
xoxp-...)
bun install
cp config.example.json config.local.json
# Edit config.local.json and add your slackTokenbun run startA lightweight Bun server serves a static UI to edit your config. It uses Basic
Auth with a single password stored in CONFIG_UI_PASSWORD when that value is
non-empty. If CONFIG_UI_PASSWORD is explicitly set to an empty string, auth
is disabled.
Build and serve the UI in one command:
CONFIG_UI_PASSWORD=your-password bun serveWatches for file changes and auto-rebuilds with hot reload:
CONFIG_UI_PASSWORD=your-password bun devBy default the server runs on port 3999. Optional environment variables:
CONFIG_UI_PORT: override portCONFIG_UI_PUBLIC_DIR: override static directory (defaultdist)CONFIG_PATH: override config file pathCONFIG_UI_PASSWORD: Basic Auth password (set to empty string to disable auth)
See package.json for additional scripts (e.g. ui:build, ui:watch, ui:serve).
This project is intentionally local-only. The updater script reads config from
config.local.json (or the fallback path under ~/.config) and runs on your
machine where Spotify is available.
For automatic execution, use the included com.spotify-status-on-slack.plist with launchd:
cp com.spotify-status-on-slack.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.spotify-status-on-slack.plist| Variable | Default | Description |
|---|---|---|
slackToken |
— | Required. Your Slack User OAuth Token (xoxp-...) |
statusTtlSeconds |
120 |
Status auto-expires after this many seconds |
statusEmoji |
:headphones: |
Slack emoji code for status |
statusEmojiUnicode |
🎧 |
Unicode version (for detection) |
alwaysOverride |
false |
Override existing status even if set by another app |
requireTwoEmptyReadsBeforeOverride |
true |
Require two empty reads before overriding |
emptyReadConfirmWindowSeconds |
600 |
Time window for double empty checks |
cacheMaxAgeSeconds |
600 |
Cache lifetime in seconds |
logMaxLines |
5000 |
Trim log when it exceeds this |
logKeepLines |
3000 |
Keep this many lines after trim |
stdoutLogPath |
./spotify-status.log |
Log file path |
stderrLogPath |
./spotify-status.error.log |
Error log file path |
MIT © 2026 Emanuel Farauanu
Inspired by work done by mpangrazzi