Repository navigation
Description
Summary
Appearance has three settings now: Mode, Accent and Vibe level. An accent colors only the message bubbles, Send and the sidebar hover and selection. The canvas, the panels and all text use one fixed neutral ramp, so every Buzz window looks almost the same.
This issue proposes themes: named, complete color sets that also color the canvas, the sidebar and the neutral surfaces. Each theme has a light mode and a dark mode. The current look stays the default as Buzz.
Proposed themes
| Theme | Description shown in Settings |
|---|---|
| Relax | Deep plum frame around a bright, open workspace. |
| Cacophony | Stacked slate panels with an electric violet glow. |
| Utmost | A steady navy sidebar, a crisp white page and a confident blue. |
| Troupe | Soft periwinkle on calm, even grays. |
| Cable | Airy sky blue with fresh green replies. |
| Howdy | A warm paper page, teal accents and minty replies. |
| Baton | Beige-box chrome and navy highlights. After dark, it glows green. |
Each palette below was measured against the design system's contrast targets, and the values were adjusted in lightness until every pair passed. All 262 measured pairs pass WCAG AA (4.5:1 for text, including text on the accent; 3:1 for online and busy dots) and APCA (Lc 60 for body text, Lc 45 for headings and metadata). Pairs measured: text and muted text on the main pane, text on received bubbles, sidebar text and headings on the sidebar, sidebar text on hover, selected text on the selected row, the Send icon on the accent, own-bubble text on the own bubble, and badge text on the badge.
Relax: Deep plum frame around a bright, open workspace.
Dark frame (canvas, top bar and sidebar) in both modes. The selected row is a pale pill with plum text in light mode.
| Role | Light | Dark |
|---|---|---|
| Canvas | #3B1238 |
#170F17 |
| Sidebar | #4C1C48 |
#211621 |
| Sidebar text | #F1E4EE |
#E4D9E2 |
| Section heading | #C8AEC3 |
#B09FAC |
| Sidebar hover | #5A2956 |
#2E202D |
| Selected row | #F6E7F2 |
#6B3466 |
| Selected text | #4A1745 |
#FFFFFF |
| Main pane | #FFFFFF |
#1C1A1E |
| Text | #1D191D |
#DDD7DC |
| Muted text | #635B62 |
#A79DA6 |
| Border | #E6DFE5 |
#34303A |
| Received bubble | #F4F0F3 |
#272429 |
| Own bubble (Chillin') | #F3E3EF |
#3B2338 |
| Own bubble text | #3E123A |
#F1E1EE |
| Accent / Send | #7B2C75 |
#94408B |
| Send icon | #FFFFFF |
#FFFFFF |
| Badge | #D0335E |
#C23D63 |
| Badge text | #FFFFFF |
#FFFFFF |
| Online / away / busy | #1A9D6F / #E8A524 / #D93C65 |
#3CC28F / #EDB547 / #E0557A |
Cacophony: Stacked slate panels with an electric violet glow.
Three slate tiers. The sidebar selection is a gray step, not the accent. Send and own bubbles use Iris.
| Role | Light | Dark |
|---|---|---|
| Canvas | #E1E3EA |
#1C1D24 |
| Sidebar | #F0F1F5 |
#292B34 |
| Sidebar text | #3B3E49 |
#BEC1CC |
| Section heading | #5C6070 |
#A4A8B6 |
| Sidebar hover | #E2E4EB |
#33353F |
| Selected row | #D6D9E2 |
#3E414C |
| Selected text | #1E2029 |
#F4F5F8 |
| Main pane | #FFFFFF |
#2F303E |
| Text | #2E3038 |
#DDDFE6 |
| Muted text | #5B5F6E |
#9EA2B0 |
| Border | #DDE0E7 |
#40424C |
| Received bubble | #F2F3F6 |
#393B45 |
| Own bubble (Chillin') | #E4E5FD |
#3A3C6E |
| Own bubble text | #1F2173 |
#ECEDFF |
| Accent / Send | #5D5FEF |
#6467F2 |
| Send icon | #FFFFFF |
#FFFFFF |
| Badge | #D1323A |
#D2353B |
| Badge text | #FFFFFF |
#FFFFFF |
| Online / away / busy | #249A57 / #D9981A / #D1323A |
#28A960 / #EFB43A / #EE4549 |
Utmost: A steady navy sidebar, a crisp white page and a confident blue.
Dark navy frame in both modes. The selected row is a solid blue pill. Send and own bubbles use Cobalt. The unread badge is white with navy text.
| Role | Light | Dark |
|---|---|---|
| Canvas | #14243F |
#0E1525 |
| Sidebar | #1B3152 |
#162037 |
| Sidebar text | #F1F4F9 |
#E3E7EF |
| Section heading | #A8B6CC |
#95A2BB |
| Sidebar hover | #26416A |
#1F2B45 |
| Selected row | #3B6CD8 |
#3C6BD9 |
| Selected text | #FFFFFF |
#FFFFFF |
| Main pane | #FFFFFF |
#131A29 |
| Text | #353A47 |
#DCE0E8 |
| Muted text | #5D6371 |
#97A0B2 |
| Border | #E1E4EA |
#252F45 |
| Received bubble | #F3F5F8 |
#1B2335 |
| Own bubble (Chillin') | #E1EAFB |
#1D2E55 |
| Own bubble text | #14306B |
#E2EAFB |
| Accent / Send | #1E5FD6 |
#3F6FDB |
| Send icon | #FFFFFF |
#FFFFFF |
| Badge | #FFFFFF |
#3966D2 |
| Badge text | #1B3152 |
#FFFFFF |
| Online / away / busy | #159E78 / #F5B521 / #D24D51 |
#3DBA87 / #F2AD12 / #D65A5D |
Troupe: Soft periwinkle on calm, even grays.
Grays with a small lavender tint. The selected row is a soft periwinkle pill.
| Role | Light | Dark |
|---|---|---|
| Canvas | #EAEAF0 |
#111114 |
| Sidebar | #F4F4F8 |
#1E1E22 |
| Sidebar text | #3E3E46 |
#D6D6DC |
| Section heading | #5D5D67 |
#A9A9B2 |
| Sidebar hover | #E9E9F1 |
#2A2A30 |
| Selected row | #E1E2F6 |
#3A3B66 |
| Selected text | #3B3D8C |
#FFFFFF |
| Main pane | #FFFFFF |
#28282D |
| Text | #242428 |
#F2F2F5 |
| Muted text | #5E5E67 |
#ADADB6 |
| Border | #DEDEE5 |
#3A3A41 |
| Received bubble | #F3F3F6 |
#323238 |
| Own bubble (Chillin') | #E7E7F8 |
#363864 |
| Own bubble text | #2E3075 |
#EEEEFF |
| Accent / Send | #5F62C2 |
#6266D9 |
| Send icon | #FFFFFF |
#FFFFFF |
| Badge | #CF3A3E |
#CC383D |
| Badge text | #FFFFFF |
#FFFFFF |
| Online / away / busy | #2D8A2D / #D98A00 / #C8232F |
#47A447 / #F0A030 / #E0484C |
Cable: Airy sky blue with fresh green replies.
A sky-blue accent with pale-green own bubbles. The night mode is blue-slate.
| Role | Light | Dark |
|---|---|---|
| Canvas | #DCE7EE |
#0D141C |
| Sidebar | #FFFFFF |
#132231 |
| Sidebar text | #22272C |
#E8EDF2 |
| Section heading | #626C75 |
#95A3B0 |
| Sidebar hover | #F0F4F7 |
#1F2B37 |
| Selected row | #2378B6 |
#2C6A9E |
| Selected text | #FFFFFF |
#FFFFFF |
| Main pane | #F7FAFB |
#0F1822 |
| Text | #15191D |
#F0F3F6 |
| Muted text | #5A646F |
#95A4B2 |
| Border | #DFE6EB |
#1F2A35 |
| Received bubble | #FFFFFF |
#192634 |
| Own bubble (Chillin') | #E8F7DB |
#2A4E72 |
| Own bubble text | #1F3313 |
#EEF5FC |
| Accent / Send | #107BBB |
#6ABAFD |
| Send icon | #FFFFFF |
#08131F |
| Badge | #2378B6 |
#6ABAFA |
| Badge text | #FFFFFF |
#06101A |
| Online / away / busy | #3B9C42 / #E3A33A / #D9534F |
#5CC160 / #E7AE48 / #E0625E |
Howdy: A warm paper page, teal accents and minty replies.
The main pane is a warm beige page. White received bubbles and mint own bubbles. The dark mode is green-slate.
| Role | Light | Dark |
|---|---|---|
| Canvas | #EDF0F1 |
#0A1115 |
| Sidebar | #FFFFFF |
#0D1C1F |
| Sidebar text | #2A3237 |
#E6ECEE |
| Section heading | #5E6A71 |
#97A5AD |
| Sidebar hover | #F2F4F5 |
#1B262D |
| Selected row | #E4F1EC |
#22323B |
| Selected text | #0B5446 |
#F2F6F7 |
| Main pane | #F4EEE2 |
#0B1419 |
| Text | #141B1F |
#E7ECEE |
| Muted text | #59636A |
#91A0A9 |
| Border | #DDE2E4 |
#1F2B32 |
| Received bubble | #FFFFFF |
#1F2B31 |
| Own bubble (Chillin') | #DAF6D0 |
#04594A |
| Own bubble text | #122A10 |
#E9F3F0 |
| Accent / Send | #00856B |
#49C8A6 |
| Send icon | #FFFFFF |
#03140F |
| Badge | #0B7F66 |
#41C8A3 |
| Badge text | #FFFFFF |
#04140F |
| Online / away / busy | #059676 / #E0A43A / #D9534F |
#1BB08C / #E8B04A / #E0625E |
Baton: Beige-box chrome and navy highlights. After dark, it glows green.
Putty-gray chrome and a navy selection in light mode. A black page with a phosphor-green accent in dark mode.
| Role | Light | Dark |
|---|---|---|
| Canvas | #C4C1B8 |
#1E1E1E |
| Sidebar | #FFFFFF |
#080808 |
| Sidebar text | #000000 |
#D2D2D2 |
| Section heading | #4A4A4A |
#9C9C9C |
| Sidebar hover | #E4E4E4 |
#1C1C1C |
| Selected row | #10108A |
#1F1FA8 |
| Selected text | #FFFFFF |
#FFFFFF |
| Main pane | #FFFFFF |
#000000 |
| Text | #000000 |
#D2D2D2 |
| Muted text | #4F4F4F |
#A4A4A4 |
| Border | #808080 |
#3A3A3A |
| Received bubble | #F2F2F2 |
#141414 |
| Own bubble (Chillin') | #E2E2F4 |
#0A2A0A |
| Own bubble text | #00004A |
#C8F5C8 |
| Accent / Send | #10108A |
#2BD12B |
| Send icon | #FFFFFF |
#001A00 |
| Badge | #C70000 |
#D41F1F |
| Badge text | #FFFFFF |
#FFFFFF |
| Online / away / busy | #008C00 / #B86E00 / #C70000 |
#2BD12B / #F7A53A / #FF3B3B |
Proposed design
- A theme setting. Add
themeto the appearance snapshot, stored asbuzz-theme.v1. The service writesdata-themeon<html>, next todata-color-mode,data-accentanddata-color-level. Unknown values fall back tobuzz. - A fixed set of theme slots. A theme overrides a tinted neutral ramp, the canvas, a new
--surface-sidebarrole and, optionally, the badge and status colors. Buttons, tabs, menus and links still read the neutral roles, so they stay neutral within each theme's tinted grays and never take the accent. - Dark frames on light pages. Relax and Utmost put the frame (canvas, top bar and sidebar) in a dark scope in light mode, and the main pane stays light. The frame reuses the dark-mode role pairs, so its text pairs are covered by the existing contrast guard.
- A signature accent for each theme. Add an accent value Theme, shown as the first swatch, which follows the active theme's family. Cacophony uses Iris, and Utmost uses Cobalt. The other five themes need new families (plum, periwinkle, sky, teal, navy and phosphor), which exist only inside their themes. Under the Buzz theme, Theme resolves to Citrus, so the default look does not change. A saved manual accent stays as it is.
- Theme-owned selection and own bubbles. A theme may set the sidebar selection pair and the own-bubble pair. Cacophony uses a gray selection, Troupe and Howdy use a soft selected pill, and Cable and Howdy use green own bubbles. The vibe level still chooses soft or solid bubbles.
- Settings. A Theme row at the top of Appearance → Interface shows radio cards with a live preview, the name and the description. It uses the existing
RadioGroup, so keyboard and screen-reader behavior stay the same. - Guards and tests.
check-contrast.mjscovers every theme × mode × vibe × accent, including the dark frame scope. There are unit tests for the service and one browser journey: pick a theme with the keyboard and with the pointer, reload, switch the mode, and check the frame scope.
Design-system decisions needed
- DESIGN.md says "Never recolor the whole shell." The proposal makes themes the only owner allowed to recolor the shell, and only through the fixed slots above. The same change updates DESIGN.md (Accent color and Both modes).
- Limit theme color to messages, send, and sidebar states #1479 limited accent color to bubbles, Send and the sidebar on purpose. The proposal keeps that limit, because shared controls stay neutral and accents keep their scope. Please review this before implementation starts.
- Five new accent families add maintenance: twelve steps × two modes, plus ink, link and pressed values each.
Out of scope for the first version
- Custom themes that people create and share.
- Syncing the theme across devices through encrypted preferences.
- Changes to corner shape or fonts for a theme.
- Mobile parity.
Implementation plan
Two parallel tracks, then one PR for each remaining theme:
- Foundation: the setting, slots, frame scope, Theme accent, Settings row, contrast guard, DESIGN.md update and the Relax theme.
- Palettes: the values for all seven themes, as palette-layer tokens only.
- Cacophony, Utmost, Troupe, Cable, Howdy and Baton, each as a small PR on top of the foundation.

Activity
blakemcanally commentedon Nov 2, 2026
🤖 Follow-up for user-defined themes: #2163
blakemcanally commentedon Nov 2, 2026
🤖 Implementation PRs (all drafts):
Some palette values moved slightly from the tables above so that every theme passes the contrast guard with no new exceptions. Each PR lists its changes.