A Vencord theme that turns Discord into a terminal IRC client: one log line per message, a clock gutter, monospace type, dim metadata and translucent panels over a wallpaper.
13:38 <PentSec> one line per message, with the clock, the nick and the text
13:38 <PentSec> sharing a single baseline
- Vencord (or Vesktop) on Discord desktop.
- Optional: the RoleColorEverywhere plugin, if you want the member-list role headers painted with each role's own colour. Discord does not expose that colour otherwise.
-
Open Discord → Vencord → Settings → Themes.
-
Paste this URL into Online Themes, one per line:
https://jeff.is-a.dev/IRcP/irc.theme.css -
Leave the field. The theme applies immediately.
The theme is served by GitHub Pages (
.cssastext/css). Its imports point at the same deployment, so a downloadedirc.theme.cssworks on its own. Do not useraw.githubusercontent.com: it serves.cssastext/plainwithnosniff, and the browser refuses it as a stylesheet.
- Download
irc.theme.css. The single file is enough: its two imports point at the hosted body, so the layout loads from the same deployment. - Drop it into your Vencord themes directory (Vencord → Themes → Open Themes Folder).
- Enable it in the Local Themes list.
To change the layout itself, do not edit the downloaded file — clone the repository and
use bun run dev (see below).
Those versions loaded their layout from irc/01-status.css, irc/02-ui.css,
irc/03-fonts.css and irc/05-messages.css. Those files are no longer published: the
layout now ships as irc.css and fonts.css. An old irc.theme.css left in place will
load the metadata and the variables but no layout. Delete it and install again.
The repository holds sources, not the built theme. deploy is generated by CI.
bun install # once
bun run dev # one self-contained irc.theme.css in your Vencord themes folder
bun run build # dist/: irc.theme.css, irc.css, fonts.css, wallpapers, licenses, .nojekyll
bun run reroll # update Discord's hashed class names in src/**/_*.scss
bun run verify:cascade # fail if a rule moved past a rule it can fight with
bun run format # Prettierbun is the only package manager used here; bun.lock is committed.
src/root.scss metadata lives in bd-scss.config.js; this file is the variables
src/main.scss body entry: @use order = cascade order
src/theme/_tokens.scss internal custom properties shared by everything
src/theme/app/ background, titlebar, toolbar, window controls
src/theme/serverlist/ guild rail: folders, items, unread pill, icons
src/theme/sidebar/ channel and DM lists, user panel
src/theme/chat/ message area, composer, dividers, notices, mentions
src/theme/members/ member list: column, rows, role groups
src/theme/popouts/ server and channel popouts
src/theme/messages/ one-line rows: row, clock, runs, reply, nick, avatar
src/theme/forum/ forum posts as log lines
src/theme/status/ presence rings, glow, avatar exceptions
src/theme/_wiring.scss maps --irc-font onto the variables Discord reads
src/addons/_fonts.scss Cascadia subsets, base64 (separate file: 163 KB)
src/assets/*.png, *.jpg wallpapers, published next to the theme
scripts/postbuild.mjs asset copy, deploy URL, @name, minify, .nojekyll
scripts/minify-css.mjs compacts irc.css; the build fails if the result is not equivalent
scripts/dev.mjs initial build + watcher (bd-scss skips the first one)
Each folder has an index.scss that @forwards its partials in cascade order. Adding a
file means adding its @forward in the right position: the order is the cascade, not
alphabetical.
bun run dev builds once and then rebuilds on every save: a single file with the fonts
and the body inlined, dropped in your client's themes folder
(~/.config/Vencord/themes on Linux; use it by enabling Local Themes). bun run build
splits it instead: the entry imports irc.css and fonts.css from the deployed URL.
The wrapper in scripts/dev.mjs exists because bd-scss dev starts the watcher but never
compiles on startup — it waits for the first file change.
Everything worth touching is in the :root block of src/root.scss, which compiles into
the top of irc.theme.css. Edit it, run the build, publish.
Renamed in 2.0.0-irc.100: --accent is now --primary, --accent-text is now
--primary-text. A snippet that still sets --accent changes nothing.
| Variable | What it does | Default |
|---|---|---|
--primary |
Main colour: glow, mentions, pills, selected channel, focus rings | #1efcf9 |
--primary-text |
Text drawn on a --primary fill (buttons, badges) |
hsl(0 0 0%) |
--secondary |
Neutral colour: unread rings, icon masks, text on a tinted row | #ffffff |
--bg-primary |
App panels; its alpha follows --opacity |
hsl(0 0% 10% / 0.83) |
--bg-secondary |
Chat column and cards | hsl(0 0% 10% / 0.855) |
--bg-solid |
Opaque panel colour, used where an alpha would show through | hsl(0 0% 10%) |
--bg-border |
Hairline between panels | hsl(0 0% 5% / 0.75) |
--scrim |
Black wash: feeds the shadows and the presence-ring cutout | hsl(0 0% 0% / 0.5) |
--glow-intensity |
Strength of every glow; 0 disables them |
1 |
--background-image |
Wallpaper; none leaves the app transparent |
none |
--background-gradient |
var(--gradient) paints the radial wash instead of the wallpaper |
var(--gradient) |
--gradient |
The wash itself: black centre, palette edge, editable stops | see the file |
--background-blur |
Blur applied to the background image | 8px |
--opacity |
Opacity of the app panels | 0.78 |
--irc-line-height |
Line height of a message row | 1.25 |
--irc-ts-width |
Clock column width (8ch for a 12-hour clock, 5ch for 24-hour) |
8ch |
--irc-avatar-size |
Avatar box in a message row; above 1em the row grows |
1.2em |
--irc-nick-glow / --irc-nick-glow-size |
Nickname halo strength and blur | 1 / 6px |
--irc-forum-stamp |
Width of the forum thumbnail column | 3.4em |
--irc-forum-row-pad |
Vertical padding of a forum log row | 2px |
--irc-category-background |
Channel-category background strength; 0 removes it |
0 |
--irc-status-members-width |
Member-list avatar box the ring is drawn around | 30px |
--irc-status-self-speaking-colour |
Ring colour while your own voice transmits | #57d39b |
--irc-status-* |
Avatar ring sizes and colours | see the file |
--members-width, --server-icon-size |
Sidebar geometry; the icon size is the server list's scale | see the file |
--guilds-width |
Width of the server list column | 80px |
--irc-guilds-visible |
1 shows the server list, 0 hides it and gives the column back |
1 |
The top of src/root.scss picks one by number:
$irc-background: 6;
$irc-backgrounds: (
1: 'bg1.png',
2: 'bg2.jpg',
3: 'bg3.jpg',
4: 'bg4.jpg',
5: 'bg5.jpg',
6: 'bg6.png',
7: 'bg7.jpg'
);Drop a file in src/assets/, add its number, rebuild. 1 is the file the body stylesheet
already loads; every other entry is written into the theme file, so that file has to be
published next to it (both scripts copy every src/assets/*.png and *.jpg). An entry may
also be an absolute URL.
Replacing a wallpaper in place keeps its URL, so the renderer can serve the old bytes from memory: reload it (Ctrl+R) or restart Discord. Switching to a different number changes the URL.
Published changes reach clients without a restart: the entry file is re-fetched on a theme toggle, and the body is a normal cached HTTP resource with a ten-minute lifetime.
- The font (Cascadia Mono) is embedded as base64 subsets, so no font is fetched.
- Forum channels, the Friends tab and the member list are themed as well. Discord moves these class hashes between builds, so a layout touch-up may be needed after a large Discord update.
- The chat toolbar icons are Tabler outline icons drawn as CSS masks.
The theme's own code and modifications are by PentSec, MIT (see LICENSE). It reuses work under these licenses:
- SoftX, Copyright (c) 2021 DiscordStyles, MIT
- RadialStatus, Copyright (c) 2020 DiscordStyles, MIT
- Cascadia Mono, Copyright (c) 2023 Microsoft Corporation, SIL OFL 1.1
- Font Awesome Free icons, Copyright Fonticons, Inc., CC BY 4.0
The MIT and OFL texts are reproduced in THIRD-PARTY-NOTICES.md; the rest are linked there.