Light mode is a remap of the sixteen EGA slots, not a second stylesheet. Every
rule in bbs.css already goes through those variables, so the whole board
inverts by redefining them and nothing below has to know.
Warm greys on sepia, monochrome. Not an EGA palette and not pretending to be
one: the amber-on-paper end of the same machine. Tones are picked by contrast
ratio against the ground rather than by eye, and the ordering of the sixteen is
preserved, so what was recessive stays recessive: --dgrey quiet, --blue chrome,
--yellow the hotkeys, --lred the loudest thing on screen. Freed from EGA
fidelity, --dgrey is lifted to 4.5:1 rather than the 2.7:1 its counterpart sits
at on black.
The switch is a command, not a button, because a board had no widgets. It names
where it is going, so it reads [L]ight on a dark screen and [D]ark on a light
one and the key moves with the label. L and D were the only two letters free
across all 71 pages. It is injected by bbs.js rather than written into the
template, so a reader without JS is not offered a switch that cannot work.
The logo takes a second set of ramps: on paper presence is ink rather than
light, so they run pale to dark and the feet stay the lightest step, which
keeps the weight where the dark version puts it. The session's ramp index is
shared, so the two themes are the same draw rendered two ways.
Dark stays the default and the no-JS result. The preference is in localStorage
rather than sessionStorage, since it is a preference and not a welcome screen,
and it is applied from <head> before first paint.
Also fixes a hardcoded #000 on the guestbook form, which would have been a
black box on paper.
Verified in a browser: 70 pages and 321 frame rows still exactly 80 columns,
the command flips both ways, the ramp follows, and the choice survives a
navigation.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The mark is fill="currentColor" inside an anchor, so an unstyled paint renders
it in the UA link blue. That is what the flash is: the document painted before
the stylesheet applies, not a theme switch.
Without a color-scheme declaration the browser treats the document as light, so
the canvas it paints between documents, and the scrollbar, are white. Gecko
paints a pending stylesheet's document far more readily than Blink does, which
is why it shows there and not in Chromium.
Dark on flux and bbs, which are dark only; all three branches on raayoni.
The other half of this is a Caddy change in bucur: every response currently
carries no Cache-Control, no ETag and no Last-Modified, so the stylesheet is
refetched on every navigation and the window keeps reopening.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
flux.vision, tobias.raayoni-last.com and randogoth.com. They were one site until
October 2026, serving four audiences from a single dated list, which is the only
format that can hold unrelated things at once.
flux.vision is recovered from the Wayback Machine, where it had sat since being
deleted in 2021: 90 articles, closed and maintained rather than updated.
tobias.raayoni-last.com is the professional record, 97 articles back to 1999.
randogoth.com is the technical work, 41 articles across six areas, served as an
ANSI bulletin board.
History starts here deliberately. The development history, the 266-row inventory
that records why each article went where it did, the Wayback pipelines, the
pruned articles, the source archives and the full-size images are kept beside
the repo rather than in it, so a clone is the web presence and not the argument
that produced it. REFACTOR.md is gitignored for the same reason. See README.md
for where that material lives, and keep it: the sort is not reproducible from
these three directories alone.
Each site documents itself in its own README, including the traps that cost time
and look like nothing when you get them wrong.