feat(discord): add BetterDiscord with gruvbox material dark theme

Restore Discord with OpenASAR overlay and BetterDiscord CSS theming.
Custom gruvbox material dark medium palette with proper read/unread
channel distinction and minimal UI tweaks. Add mpd-discord-rpc for
music rich presence.
This commit is contained in:
jasmine 2026-02-01 17:35:55 +08:00
parent f918946723
commit b180fb4481
Signed by: jasmine
GPG key ID: 8563E358D4E8040E
5 changed files with 129 additions and 1 deletions

View file

@ -25,4 +25,17 @@
}
'';
};
# Discord rich presence for MPD
services.mpd-discord-rpc = {
enable = true;
settings = {
hosts = ["localhost:6600"];
format = {
details = "$title";
state = "$artist - $album";
timestamp = "elapsed";
};
};
};
}

View file

@ -1,6 +1,7 @@
{pkgs, ...}: {
imports = [
./cava
./discord
./mpv
./obs
];

View file

@ -0,0 +1,95 @@
:root {
--font-primary: Fisa Code;
/* Gruvbox Material Dark Medium */
--bg-dim: #232323;
--bg0: #282828;
--bg1: #32302f;
--bg2: #45403d;
--bg3: #5a524c;
--bg4: #665c54;
--bg5: #7c6f64;
--fg0: #d4be98;
--fg1: #ddc7a1;
--grey0: #7c6f64;
--grey1: #928374;
--grey2: #a89984;
--red: #ea6962;
--orange: #e78a4e;
--yellow: #d8a657;
--green: #a9b665;
--aqua: #89b482;
--blue: #7daea3;
--purple: #d3869b;
}
.theme-dark {
/* Text */
--text-default: var(--fg0); /* main chat */
--text-strong: var(--fg1); /* usernames, selected channel, server accent */
--text-subtle: var(--grey2); /* user status, is typing */
--text-muted: var(--grey2); /* DM friendslist, user status */
--white: var(--fg0);
/* Channels */
--channels-default: var(--grey2); /* read channel text */
--channel-icon: var(--grey2); /* read channel icon */
--interactive-text-active: var(--fg1); /* unread channel text */
--icon-subtle: var(--fg1); /* unread channel icon */
--interactive-text-hover: var(--grey2); /* hovered read channel text */
/* Other icons */
--icon-muted: var(--grey2);
--icon-strong: var(--fg1); /* selected channel */
--interactive-icon-default: var(--grey2);
--interactive-text-default: var(--grey2);
/* Placeholders */
--channel-text-area-placeholder: var(--grey2);
--input-placeholder-text-default: var(--grey2);
/* Backgrounds */
--background-base-lowest: var(--bg-dim); /* sidebar, channel list, topbar */
--background-base-lower: var(--bg0); /* main chat, member list */
--background-base-low: var(--bg0); /* user panel */
--background-surface-high: var(--bg1); /* link previews, server hover, active dm */
--background-surface-higher: var(--bg1); /* active now game/status */
--background-mod-muted: var(--bg1); /* active now name bubble */
--background-mod-subtle: var(--bg1); /* server folders, add server */
--background-mod-normal: var(--bg2); /* hover states */
--background-mod-strong: var(--bg1); /* username tag bubbles */
/* Input */
--input-background-default: var(--bg0); /* search bar input box*/
--chat-background-default: var(--bg1); /* chat input box */
/* Scrollbar */
--scrollbar-thin-thumb: var(--green);
--scrollbar-thin-track: transparent;
--scrollbar-auto-thumb: var(--green);
--scrollbar-auto-track: transparent;
}
/* Remove input borders */
[class*="searchBar"],
[class*="channelTextArea"],
[class*="textArea"] {
border: none !important;
}
/* Hide server banner and boost goal bar */
[class*="bannerVisible"],
[class*="progressContainer"],
[class*="content"] > [aria-hidden="true"][style*="height"] {
display: none !important;
}
/* Hide new messages bar */
[class*="newMessagesBar"] {
display: none !important;
}

View file

@ -0,0 +1,17 @@
{pkgs, ...}: {
nixpkgs.overlays = [
(final: prev: {
discord = prev.discord.override {withOpenASAR = true;};
})
];
home.packages = with pkgs; [
discord
betterdiscordctl
];
home.file.".config/BetterDiscord/data/stable/custom.css" = {
enable = true;
source = ./config/custom.css;
};
}

View file

@ -21,6 +21,8 @@
# all allowed packages here rather than scattering predicates across feature modules.
allowUnfreePredicate = pkg:
builtins.elem (lib.getName pkg) [
"discord"
# Development tools
"claude-code"
"idea"