{"id":51329150,"url":"https://github.com/markmandel/discord-notification-center","last_synced_at":"2026-07-01T21:05:10.453Z","repository":{"id":357939369,"uuid":"1206248463","full_name":"markmandel/discord-notification-center","owner":"markmandel","description":"Totally experimental, not supported or official linux gui for Discord notification management","archived":false,"fork":false,"pushed_at":"2026-05-14T22:15:44.000Z","size":88,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-15T00:31:00.524Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/markmandel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-09T18:15:04.000Z","updated_at":"2026-05-14T22:15:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/markmandel/discord-notification-center","commit_stats":null,"previous_names":["markmandel/discord-notification-center"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/markmandel/discord-notification-center","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markmandel%2Fdiscord-notification-center","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markmandel%2Fdiscord-notification-center/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markmandel%2Fdiscord-notification-center/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markmandel%2Fdiscord-notification-center/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markmandel","download_url":"https://codeload.github.com/markmandel/discord-notification-center/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markmandel%2Fdiscord-notification-center/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35022667,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-01T21:05:09.762Z","updated_at":"2026-07-01T21:05:10.447Z","avatar_url":"https://github.com/markmandel.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# discord-notification-center\n\nA notification center for Discord. The daemon listens for incoming notifications\nvia the Discord RPC IPC interface and stores them in a local SQLite database.\nThe `toggle` command opens a Wayland layer-shell panel (Rose Pine themed) that\ndisplays unread notifications and lets you act on them.\n\n## Commands\n\n### `daemon` (default)\n\nConnects to the running Discord client via IPC, authenticates, and subscribes to\n`NOTIFICATION_CREATE` events. Each notification is persisted to the local SQLite\ndatabase, including the `guild_id` resolved via a follow-up `GET_CHANNEL` RPC call\n(needed for Discord deep links).\n\nIf Discord is not running when the daemon starts, it waits and retries every 5\nseconds until it can connect. If the connection drops while running (e.g. Discord\nis restarted), the daemon reconnects automatically on the same 5-second poll.\n\nA system notification (`notify-send`) is shown on first connect, on disconnection,\nand on reconnect.\n\nOnly one daemon instance may run at a time; a second invocation will exit\nimmediately with an error.\n\nNotifications older than 24 hours (excluding pinned) are deleted on startup and\nonce every 4 hours while the daemon is running.\n\n```\ndiscord-notification-center\ndiscord-notification-center daemon\n```\n\n### `toggle`\n\nToggles the Wayland layer-shell notification panel: slides in from the right if\nnot visible, or closes it if already open. Bind this to a key in your compositor\nfor quick access.\n\n```\ndiscord-notification-center toggle\n```\n\n**Panel features:**\n\n- Only notifications from the last 24 hours are shown (pinned notifications are\n  always visible regardless of age)\n- Notifications are listed newest-first; new arrivals appear while the panel is\n  open (polled every second from the database)\n- Sender avatars are loaded asynchronously from Discord's CDN\n- Multiple unread messages from the same channel or DM are **grouped** into a\n  single summary row; hovering expands the group to show individual messages\n- Each notification (and each row inside an expanded group) has two action buttons:\n  - **📌 / 📍** — pin or unpin (pinned notifications stay visible until explicitly unpinned)\n  - **✓ / ↩** — mark as read / mark as unread\n- Clicking a notification (or a group header) navigates directly to that channel\n  in the Discord client and marks it as read\n- **✓** on a group header marks all messages in that channel as read\n- **✓ all** button in the header marks every notification as read\n- **All** toggle (or **Ctrl+F**) switches to full-history mode and focuses the\n  filter field; switching back clears the filter\n- **Filter field** (All mode only) — type to instantly filter notifications by\n  channel name, body text, sender, or message content; the **✕** button clears it\n- **Esc** closes the panel\n\n## Keyboard shortcuts\n\n| Key | Action |\n|-----|--------|\n| `Ctrl+F` | Switch to All mode and focus the filter field |\n| `Esc` | Close the panel |\n\n## Configuration\n\nCreate a config file at `~/.config/discord-notification-center/config.toml`:\n\n```toml\nclient_id = \"your-discord-client-id\"\nclient_secret = \"your-discord-client-secret\"\n```\n\n`client_id` and `client_secret` come from your application in the\n[Discord Developer Portal](https://discord.com/developers/applications). The app\nmust have the `rpc` and `rpc.notifications.read` OAuth2 scopes enabled.\n\nOn first run the daemon will create the SQLite database automatically at\n`~/.config/discord-notification-center/notifications.db`.\n\n## Building\n\n### Debian/Ubuntu dependencies\n\nThe GTK4 layer-shell library and its build dependencies must be installed before\n`cargo build` will succeed:\n\n```\nsudo apt install libgtk4-layer-shell-dev libgtk-4-dev libwayland-dev wayland-protocols pkg-config\n```\n\nThe runtime libraries (`libgtk4-layer-shell0`, `libgtk-4-1`, `libwayland-client0`)\nare pulled in automatically as dependencies of the dev packages above.\n\n### Compile\n\n```\ncargo build --release\n```\n\n## LICENCE\n\nApache 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkmandel%2Fdiscord-notification-center","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkmandel%2Fdiscord-notification-center","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkmandel%2Fdiscord-notification-center/lists"}