Dynamic Discord Rich Presence for Hyprland and COSMIC (Wayland). Automatically updates your Discord status based on the active window.
- Dynamic status — builds your Discord Rich Presence live from the active window (class → name, title → details). No need to list every app.
- Browser support — automatically cleans browser tab titles (strips
- Mozilla Firefoxstyle suffixes, extracts domains from bare URLs, replaces "New Tab" with the app name). - Any application works out of the box; only minimal optional config
- Lightweight and fast (Rust + Wayland events)
- Works on Hyprland (via
ddsh) and COSMIC (viaddsc)
git clone https://github.com/Veridian-Zenith/DDS.git
cd DDS
./scripts/install.sh --release --hyprland # or --cosmic, or --all
systemctl --user daemon-reload
systemctl --user enable --now discord-monitor-hyprland.service # or discord-monitor-cosmic.serviceOptions:
--hyprland— installddshonly--cosmic— installddsconly--all— install both (default if no flag given)--release— build in release mode (omit for debug)
This installs the binary and a systemd user service that auto-launches the status app whenever Discord is running, and stops it when Discord closes. It restarts automatically if Discord is reopened.
cargo run --release -p ddsh # Hyprland
cargo run --release -p ddsc # COSMICHyprland (ddsh):
yay -S ddsh-bin # pre-built binary
yay -S ddsh-git # builds from latest commitCOSMIC (ddsc):
yay -S ddsc-bin # pre-built binary
yay -S ddsc-git # builds from latest commitThe config file is stored in a desktop-specific directory:
- Hyprland:
~/.config/Dynamic-DRPC-Hyprland/config.json - COSMIC:
~/.config/Dynamic-DRPC-COSMIC/config.json
The status is generated dynamically from the active window, so the config is minimal. A default one is created automatically on first run.
{
"app_id": "1527185646274220072",
"default_large_image": "arch",
"details_from_title": true,
"image_map": {
"kitty": "kitty",
"org.mozilla.firefox": "firefox"
},
"name_map": {
"org.mozilla.firefox": "Firefox"
}
}{
"app_id": "1529346794427777125",
"default_large_image": "arch",
"details_from_title": true,
"image_map": {
"kitty": "kitty",
"org.mozilla.firefox": "firefox"
},
"name_map": {
"org.mozilla.firefox": "Firefox"
}
}How it works:
app_id— your Discord Application ID (from the Developer Portal, not a bot token).details_from_title— (defaulttrue) use the live window title as the details line.- The state is always
"Using <name>"where<name>is the window's class, auto-prettyfied (e.g.org.mozilla.firefox→Firefox,kitty→Kitty). image_map— optional: map a window class to a Discord asset key for the large image. Anything unlisted falls back todefault_large_image.name_map— optional: override the auto-prettyfied display name for a class.
You only add entries to image_map / name_map for apps you want to brand
nicely — everything else just works with the raw class name.
Note: image asset keys still have to exist in your Discord app's Art Assets (Developer Portal), since assets can't be uploaded automatically.
- Discord must be online and not in Invisible mode
- Any asset keys used in
image_map/default_large_imagemust exist in Discord Developer Portal → Art Assets - Of course, you should have an internet connection :)
Open Software License 3.0 — see LICENSE