A quiet macOS menubar client for Discord. Discord itself runs hidden as a background service; the only thing you see is a status bar icon and the handful of conversations you actually care about.
Discord on macOS insists on being a foreground app: Dock icon, Cmd-Tab entry, a window to manage. Concord puts the conversations in the menu bar and gets the rest out of the way.
Discord has no official way to read your own messages. Bot accounts cannot see DMs, the sanctioned local RPC API cannot send, and the clients that do everything use a raw user token and get accounts locked. So Concord does none of those.
Instead a small plugin runs inside Discord's own web client, via Vencord and Vesktop, and pushes what you care about over a local socket to a native menubar app. Discord's own code makes every network call, so the traffic is indistinguishable from the real client.
Vesktop (hidden) Concord.app
+--------------------------+ +------------------+
| Discord web client | | SwiftUI menubar |
| +--------------------+ | socket | |
| | MenubarBridge |--|----------->| 127.0.0.1:8787 |
| | Vencord plugin | | NDJSON | (server) |
| +--------------------+ | +------------------+
+--------------------------+
The app is the server and the plugin connects out to it, because the app outlives Discord restarts.
app/ |
The SwiftUI menubar app |
bridge/ |
The Vencord plugin, in TypeScript |
tools/mock-bridge/ |
Fake plugin, so the app can be run without Discord |
scripts/ |
Hiding Vesktop, and running it under launchd |
docs/ |
Spec, wire protocol, setup, implementation plan |
docs/SETUP.mdis what you want if you just need it running.docs/SPEC.mdcovers the design and, importantly, the constraints that shaped it.docs/PROTOCOL.mdis the contract between the two halves. Neither side may change it alone.
cd app && xcodebuild test -project Concord.xcodeproj -scheme Concord -destination 'platform=macOS'
cd bridge && bun test && bun run typecheckThe app can be developed without Discord at all. Start it, then run the mock bridge, which speaks the same protocol and makes up traffic:
bun tools/mock-bridge/index.ts --chaos--chaos drops the connection every 20 seconds, which is how the reconnect
handling gets exercised.
- Discord has to be running. The plugin lives inside it. Hidden, but resident, and that costs around 460 MB. There is no version of this that both works and runs alone without risking your account.
- Custom emoji render as their raw
<:name:id>form. - Reactions, threads, voice and rich embeds are deliberately out of scope. This is for reading a conversation and replying to it in one line.
GPL-3.0-or-later. See LICENSE.
The plugin has to be: it is built against Vencord, which is GPL-3.0. The Swift app never links Vencord and talks to the plugin over a socket, so it could in principle carry a different licence, but one licence across one repo is less to explain than a boundary nobody asked for.