A modern, open desktop client for Discord Rich Presence.
Design your Discord activity, save it as reusable profiles, and broadcast it in one click - in a clean, native, offline-first app.
| Dashboard | Profiles |
|---|---|
![]() |
![]() |
| Editor | Settings |
|---|---|
![]() |
![]() |
| Rules |
|---|
![]() |
- Grab the latest
PresenceFlow_<version>_x64-setup.exefrom the Releases page. - Run it - it installs per-user, so there's no admin/UAC prompt.
SmartScreen note: the installer is not code-signed yet, so Windows may show "Windows protected your PC." Click More info -> Run anyway to proceed. This is expected for unsigned open-source apps.
You'll also need the Discord desktop app running for Rich Presence to appear.
- Open Profiles -> New profile.
- Paste your Discord Application ID (create one at the Discord Developer Portal).
- Fill in details, state, images, timestamps, and buttons in the Editor - a live preview shows exactly how it looks in Discord.
- Go to the Dashboard and hit Start Presence.
From the tray (right-click the icon):
- Pick a profile to start broadcasting it immediately.
- Stop broadcasting at any time.
- Switch Theme (System / Light / Dark).
- Quit to fully close the app.
Closing the window keeps PresenceFlow running in the tray (configurable). Use Quit on the Dashboard, in Settings, or in the tray menu to exit completely.
The Rules tab lets PresenceFlow pick the profile for you, based on the app you're currently using - "while Code.exe is running, broadcast my Coding profile." It's completely optional and off by default.
Set it up:
- Create the profiles you want to switch between on the Profiles page.
- Open Rules and turn on Automatic switching (the master toggle at the top).
- Click Add rule, then:
- Press the app button and pick a running app from the list (or type an executable name
like
Spotify.exe- the.exeand letter case don't matter). - Choose the profile to broadcast when that app is running.
- Press the app button and pick a running app from the list (or type an executable name
like
- Drag rules by the handle to set their priority. Rules are checked top to bottom, and the first running app wins, so put your most specific rules higher up.
- Toggle any rule off to keep it without using it. Everything is saved as you go.
Two behaviors you control:
- When no rule matches (none of your apps are running): Do nothing (keep whatever is broadcasting), Turn off presence, or switch to a chosen Default profile.
- When you pick a profile manually while automatic switching is on: Manual wins (your hand-picked profile stays until the set of running apps changes) or Rules win (automation reconciles back to your rules within a few seconds).
Automatic switching runs whenever PresenceFlow is running - including while it's minimized to the tray. Turn the master switch off at any time and the app behaves exactly as before. Detecting which apps are running happens entirely in the app's trusted Rust core; the interface is never granted any access to your processes.
Profiles and settings are saved as plain JSON in your per-user app-data folder:
%APPDATA%\com.presenceflow.app\
├── profiles.json # all your saved profiles
├── settings.json # appearance & startup preferences
└── rules.json # automatic-switching rules (the Rules tab)
Writes are atomic (temp file + rename), so a crash mid-save can't corrupt your data, and a
corrupt settings.json or rules.json is set aside as a .bak file instead of being lost.
You can jump straight there via Settings -> System -> Data folder -> Open.
Prerequisites: Node.js 20+, the Rust toolchain, and the WebView2 runtime (preinstalled on Windows 11).
npm install # install frontend dependencies
npm run tauri dev # run the app in development
npm run tauri build # produce the NSIS installer in src-tauri/target/release/bundle/nsis/- Shell: Tauri 2 (Rust) - tiny footprint, native tray & windowing.
- Frontend: React 19 + TypeScript + Vite, Tailwind CSS v4, zustand, framer-motion, lucide-react.
- Discord IPC:
discord-rich-presence.
- Locked capabilities - the webview is granted only window controls plus the dialog, opener, and autostart plugins. No filesystem, shell, or HTTP scopes are exposed to the UI; all disk access - and the running-app detection used by Rules - happens in trusted Rust code, so no OS access is ever exposed to the interface.
- Content Security Policy - a strict CSP is enforced in production builds.
- Atomic, local storage - no telemetry, no remote calls beyond your local Discord client.
Issues and pull requests are welcome. For larger changes, please open an issue first to discuss what you'd like to change.
Licensed under the Apache License 2.0.




