Discord Rich Presence for Cutter, the Rizin powered reverse engineering GUI.
- Name of the open binary
- Current function and address
- Architecture, file format and function count
- Session runtime
- State as a verb: Reversing, Analyzing, Debugging, Emulating
Every item can be turned off on its own.
git clone https://github.com/nvrmnd-png/CutterDiscordRPC.git
cd CutterDiscordRPC
./setup.shThe script finds your Cutter installation, tells you which versions it sees, and then offers two ways forward:
- Prebuilt pulls a matching binary from the releases page, nothing to compile
- Build from source compiles against whatever you have installed
It knows the difference between a system install, a Flatpak and an AppImage, picks the right plugin directory for each, and verifies afterwards that the installed file is actually there. Non interactive runs work too, with ./setup.sh --prebuilt or ./setup.sh --build.
Doing it by hand
sudo apt install cmake g++ qt6-base-dev rizin-dev
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install buildPlugin directories per flavor:
- System install:
~/.local/share/rizin/cutter/plugins/native/ - Flatpak:
~/.var/app/re.rizin.cutter/data/rizin/cutter/plugins/native/ - Windows:
%APPDATA%\rizin\cutter\plugins\native\ - macOS:
~/Library/Application Support/rizin/cutter/plugins/native/
Restart Cutter afterwards. Help → About → Plugins has to list "Discord Rich Presence".
A native plugin only loads when Cutter, Qt and Rizin match the versions it was built against. A Flatpak has to be built inside its own sandbox, which
setup.shdoes for you. An AppImage ships its libraries but no headers, so nothing can be compiled against it, only a prebuilt matching that exact AppImage will work.
Everything lives under Plugins → Discord Rich Presence:
- Enabled turns the presence on and off
- Options… opens the settings and shows the connection state live
Stored in ~/.config/rizin/cutter/discord_rpc.json and reloaded the moment you save it:
{
"enabled": true,
"update_interval": 15,
"show_filename": true,
"show_function": true,
"show_address": true,
"show_time": true,
"show_arch": true,
"address_type": "cursor"
}update_interval is the wait in seconds between two updates, at least 15, because Discord accepts only five updates per 20 seconds. address_type is either cursor for the address under the cursor or function_start for the beginning of the current function.
No login, no token, no OAuth. The plugin writes to the local IPC socket of the Discord desktop client that is already signed in on the same machine, so the account comes from the client, never from the plugin.
The presence is visible only with the desktop client, and only while Settings → Activity Privacy has the display of your current activity enabled.
File names and function names are sent to Discord and are visible to everyone who can see your profile. For confidential work turn off Show file name or disable the presence entirely.
- Plugin does not appear: almost always an ABI mismatch, Cutter, Qt and Rizin have to match your build environment
- No presence although connected: check the activity setting in the Discord client
- Status stays on "Connecting…": Discord is not running or the socket is unreachable, the plugin keeps retrying on its own
- Log output:
QT_LOGGING_RULES="cutter.discordrpc*=true" cutter, once the main window is up it goes to Cutter's console widget
If this plugin made your reversing sessions a bit nicer, consider chipping in:
- BTC
bc1qmgnz54x4epaeuvz558z4d7n3a3dqk3vldsgcnt - XMR
43eLK3JjmkDiWAuP9b5N8sahtzQQByaVSEPbZvVTctXAYJ1cHGXbVL3f8PSREnmnSsY4rMkhx14UA8vxc5sfz4ZhDfxKkg5 - ETH
0x8CF98DeF5d716E10697E5905caff34b405dcd4fF - SOL
DFwWy5EMB5QRd1FTV81ft5WYyH6uHecRvPsXkLNRyh1s
MIT, see LICENSE.
