Slack Activity automatically updates your Slack status based on what you are doing locally, similar to Discord rich presence. It can show Steam games, Spotify playback, coding tools, design apps, meetings, and other desktop activity.
- Copy
.env.exampleto.env. - Create a Slack app and set the redirect URL to
http://localhost:3000/auth/slack/callback. - Add Slack user scopes:
users.profile:writeandusers.profile:read. - Create a Spotify app and set the redirect URI to
http://localhost:3000/auth/spotify/callback. - Fill in
SLACK_CLIENT_ID,SLACK_CLIENT_SECRET,SPOTIFY_CLIENT_ID, andSPOTIFY_CLIENT_SECRET. - Run
npm start. - Open
http://localhost:3000and connect Slack, then Spotify.
Use npm run local for the old single-user local watcher.
- Multi-user hosted Slack + Spotify authorization.
- Local agent for Steam games, desktop apps, coding tools, media tools, and meeting apps.
- Per-app status customization with custom text and emoji.
- Category priority settings, so users can prefer coding, games, music, meetings, or media.
- Pause mode and quiet hours.
- Optional quiet mode while a meeting app is running.
- Hosted settings UI for categories, priorities, privacy, and per-app custom status text/emoji.
- Hosted server communication for Slack status updates.
- Windows tray controls for pause/resume, dashboard, restart, exit, and start on login.
- Automatic Slack status expiration. The default is 30 minutes.
- Git project-aware coding status, such as
Coding in slackActivity. - Local agent update checks from GitHub Releases, with dashboard download support.
| Source | Supported apps/activity | Status format | Notes |
|---|---|---|---|
| Steam local agent | Installed Steam games | Playing <game> |
Detects running installed Steam games from local Steam libraries. Ignores Steamworks Common Redistributables. |
| Spotify local agent | Spotify desktop process | Listening to <artist> - <song> or Listening on Spotify |
Track title depends on what the OS exposes locally. |
| Spotify Web API | Spotify account playback | Listening to <artist> - <song> |
Requires the user to connect Spotify in the hosted app. |
| Code editors | VS Code, Cursor, IntelliJ IDEA, PyCharm, CLion, Neovim, Vim, Xcode, Sublime Text, Android Studio, WebStorm, Rider, Eclipse, Terminal, Windows Terminal, iTerm, Unity, Unreal Engine | Coding in <app> or Coding in <git repo> |
Requires the local agent. |
| Design tools | Figma, Sketch, Blender, Photoshop | Designing in <app> |
Requires the local agent. |
| Other games/launchers | Epic Games Launcher, League of Legends, Valorant | Playing <app> |
Process-name based detection from the local agent. |
| Music apps | Apple Music, foobar2000 | Listening on <app> |
Process-name based detection from the local agent. |
| Media tools | DaVinci Resolve, OBS | Using <app> |
Requires the local agent. |
| Meeting apps | Discord, Zoom, Microsoft Teams | In a meeting on <app> |
Requires the local agent. |
Default local activity priority is:
Meeting > Game > Coding > Music > Design > Media > Spotify Web API > Clear status
Users can override this priority in settings.
The hosted app can read Spotify through the Spotify API, but Steam and desktop apps must be detected on the user's own computer.
Run the local agent on the user's computer:
$env:SERVER_URL="https://your-app-name.herokuapp.com"; npm run local-agentThe agent opens the hosted app in the browser. After the user authorizes Slack and Spotify, the agent saves its local token in ~/.slack-activity/agent.json and starts reporting Steam games and supported desktop apps. Fresh local activity takes priority over Spotify.
The local agent reports activity to the hosted server, and the hosted server communicates with Slack.
An optional local dashboard can be enabled for development only:
$env:LOCAL_DASHBOARD="true"; npm run local-agentWhen enabled, it runs at http://localhost:3784. It is disabled by default in normal builds.
The hosted app includes a settings UI. After connecting Slack and Spotify, open:
https://your-app/settings?token=<LOCAL_AGENT_TOKEN>
The settings page lets users configure:
- quiet hours
- quiet mode while meeting apps are active
- enabled activity categories
- category priority
- privacy toggles
- per-app custom status text
- per-app emoji
- per-app enable/disable
The local agent fetches these settings from the hosted server. Local fallback settings can still be placed at:
~/.slack-activity/settings.json
Example local fallback settings:
{
"pausedUntil": null,
"quietHours": {
"enabled": false,
"start": "22:00",
"end": "09:00"
},
"quietWhenMeeting": false,
"enabledCategories": ["game", "coding", "design", "music", "media", "meeting"],
"categoryPriority": ["meeting", "game", "coding", "music", "design", "media"],
"appOverrides": {
"VS Code": {
"enabled": true,
"text": "Coding in VS Code",
"emoji": ":computer:"
},
"Valorant": {
"enabled": true,
"text": "Playing Valorant",
"emoji": ":dart:"
},
"Spotify": {
"enabled": true,
"text": null,
"emoji": ":spotify_logo:"
}
},
"privacy": {
"showProjectName": true,
"showSongName": true,
"showGameName": true
}
}To pause updates from local JSON settings, set pausedUntil to a future Unix timestamp in milliseconds. To disable a whole category, remove it from enabledCategories. To disable one app, set its override to { "enabled": false }.
On Windows, users should run SlackActivity.exe. It starts the local agent in the background and adds a system tray icon.
Tray menu options:
- Open Slack Activity
- Pause for 1 hour
- Pause until tomorrow
- Resume updates
- Start on login
- Disable start on login
- Restart Agent
- Exit
Use the tray menu's Exit item to stop the agent. On exit, the tray app asks the agent to clear the Slack status before shutting down.
Slack statuses expire automatically after 30 minutes by default. Override this with:
STATUS_EXPIRATION_SECONDS=1800Set a larger value for longer-lived statuses, or a smaller value if you want Slack to clear stale activity sooner.
The local agent can check the latest GitHub Release and download the correct asset for the current OS.
Downloaded updates are saved to:
~/.slack-activity/updates/
The updater currently downloads updates only. It does not replace the running executable automatically yet, because Windows cannot safely replace a running .exe directly.
Update controls are available in the optional local dashboard when LOCAL_DASHBOARD=true.
Set the current app version with:
APP_VERSION=1.1.0Build local-agent binaries:
npm run build:agent:win
npm run build:agent:linux
npm run build:agent:macOn Windows, macOS binaries are built unsigned. Sign them on a Mac before distribution.
Generated binaries are written to dist/:
SlackActivity.exe Windows tray app
linux/slack-activity-agent-linux-x64 Linux x64
macos/slack-activity-agent-macos-x64 macOS x64
macos/slack-activity-agent-macos-arm64 macOS Apple Silicon
macOS builds must be signed on a Mac before distribution:
codesign --sign - dist/macos/slack-activity-agent-macos-x64
codesign --sign - dist/macos/slack-activity-agent-macos-arm64Attach Postgres DB before connecting users, For this I used Neon DB as it is free and reliable :)
You need to set DATABASE_URL in your environment variable on your hosting service. Without Postgres, connected users are stored in SQLite and will disappear after redeploys or dyno restarts.
Set these config vars to your app URL:
BASE_URL=https://your-app-name.herokuapp.com
SLACK_REDIRECT_URI=https://your-app-name.herokuapp.com/auth/slack/callback
SPOTIFY_REDIRECT_URI=https://your-app-name.herokuapp.com/auth/spotify/callbackAdd the same callback URLs in the Slack and Spotify app dashboards.
I have used Codex in this project for bug fixing, replacing features and also it helped me to integrate HTML into the JS to build a proper web dashboard for the slack extension, it also gave me suggestions like what more features I can add.