Rahela@457 downloadsA warm analog theme for Obsidian — measured WCAG AA contrast in both light and dark.
A warm analog theme for Obsidian — graphite-and-cream in the dark, ink-on-paper in the light, with an amber accent running through both. Every colour pair it ships with has been measured against WCAG 2.1 AA rather than eyeballed.

node scripts/check-contrast.mjs.:focus-visible.prefers-reduced-motion and
prefers-contrast: more are both honoured with no configuration.theme.css, local font stacks only.
Nothing is fetched at runtime.| Dark | Light |
|---|---|
![]() |
![]() |
Once the theme has been published to the directory:
theme.css and manifest.json from the
latest release.Retro Relay in your vault at
.obsidian/themes/.The folder name has to match the name in manifest.json exactly, or Obsidian
will not list the theme.
From a clone of this repository:
bash scripts/install-local.sh # finds your vaults, asks which
bash scripts/install-local.sh --all # install into every vault found
bash scripts/install-local.sh --vault "/path/to/vault"
git clone https://github.com/RahelaQ/retro-relay.git
cd retro-relay
# Verify the palette still passes contrast after any edit
node scripts/check-contrast.mjs
# Build the clean release payload into dist/
node scripts/build-release.mjs
test-vault/ is a ready-made vault that exercises every element the theme
styles — open it in Obsidian and the theme is already selected. After editing
theme.css, run node scripts/build-release.mjs --sync-vault to refresh the
copy inside it.
All colour lives in two blocks in theme.css — .theme-dark (section 3) and
.theme-light (section 4). Everything from section 5 onward only references
those tokens, so re-skinning the theme means editing the palette and nothing
else:
.theme-dark {
--rr-accent: #F0A055; /* links, H1, warnings, focus ring */
--rr-teal: #62C3B2; /* tags, external links */
--rr-ink: #F2E9D8; /* body text */
--rr-bg-1: #191C20; /* editor background */
}
After changing anything, re-run node scripts/check-contrast.mjs — a custom
accent is not verified automatically.
Install the Style Settings community plugin and the theme exposes these under Settings → Style Settings → Retro Relay:
| Setting | Default | Effect |
|---|---|---|
| Always underline links | off | Links stop relying on colour (WCAG 1.4.1) |
| Increase contrast | off | Pushes ink to the extremes, firms up borders |
| Disable animations | off | Manual equivalent of prefers-reduced-motion |
| Dyslexia-friendly body font | off | OpenDyslexic / Atkinson Hyperlegible, looser spacing |
| Body font size | 16px | 12–24px |
| Body line height | 1.6 | 1.2–2.2 |
| Readable line length | 42rem | 30–90rem |
| Accent colour | per scheme | Separate light and dark values |
| Plain table rows | off | Turns zebra striping off |
| Scanline texture on headings | off | Cosmetic CRT nod |
| Hide the spectrum bar | off | Removes the chromatic band along the window's top edge |
| Hard-edged spectrum bar | off | Discrete broadcast colour bars instead of a smooth blend |
| Spectrum bar height | 6px | 2–12px |
| Stronger atmospheric wash | off | Deepens the dark-mode cloud field (still clears its contrast target, with less margin) |
| Hide the orbital plate | off | Removes the graph view's orbits, reticle and star glow |
| Orbit and reticle strength | 0.12 | 0–0.6 |
| Star glow strength | 0.05 | 0–0.4 |
Every toggle defaults to the theme's shipped behaviour, so installing the plugin changes nothing until you touch a switch.
:has() and
prefers-contrast).Issues and pull requests are welcome. Before opening a PR:
node scripts/check-contrast.mjs passes.scripts/ are from
Lucide (ISC licence), the icon set Obsidian itself uses.MIT © 2026 RahelaQ