Dither lab
A working comparison sheet for the site’s low-energy graphics: CSS pattern tiles, dividers, stepped animations, and image pipeline variants — so we can pick favourites before rolling them out everywhere.
01 · Pattern tiles (CSS-only, ~200 bytes each)
Bayer 4×4 threshold tiles as inline SVG data URIs. Theme-aware, zero requests. Top row at 8px scale, bottom row at 4px.
02 · Dividers
A · .dither-fade — density ramp, ink to nothing:
B · .dither-fade--up — reversed ramp:
C · .shade-rule — pure Unicode text, zero graphics:
D · dithered <hr> as used in article content:
03 · Motion (steps() animations, paused under reduced-motion)
Terminal cursor
The homepage hero and post banners also run interactive canvas
effects (pixel-fx.js): a coarse-grid ripple simulation follows
the pointer, rendered as chunky pixels or as an ASCII ░▒▓█ ramp, with the
same sparkle sprites as a separate, composable effect. Configured via
[Params.pixelFx] in hugo.toml, per-slide
fx / fx_color in data/slides.toml
and per-post fx / fx_color front matter.
04 · Photo treatments (surveillance capitalism post image)
Same source photo through different pipeline settings. Sizes are actual file weights served.





04b · Hero cutout treatments (on accent background)




04c · Two-colour pix graphics (auto-detected sources)
Sources that are already essentially two colours skip dithering and are snapped to exactly two colours — same look, tiny file, crisp pixels. Colour pairs are remappable per image (white/transparent, kept as-is, or any pair).

05 · 88×31 buttons (steal these)
Classic web-button size, dithered. Shown at 1× and 2×.
