The three effects had drifted apart from each other and from the token
system. Consolidate them behind --crt-* tokens and fix what was broken.
- The animated text-shadow silently overrode the static one, so
reduce-motion users saw a 5px white glow and everyone else a 3px
currentColor glow. Both now come from one declaration, with the
aberration offset factored out into --crt-shift.
- Step the aberration instead of tweening it. text-shadow is not
compositable and this one inherits to every glyph, so the smooth
version repainted the whole document at refresh rate.
- The flicker was invisible: a near-black tint at an effective alpha of
0.008-0.096 over a black background, a peak lift of under 2/255.
Retint with the accent at ~3%.
- Anchor the vignette to the viewport. It was sized to body's box, which
is document-height, so on long pages the bloom sat off-screen.
- Pin the overlays with position: fixed rather than painting
document-sized layers, and give the grille hard stops so it is three
stripes rather than a smooth R->G->B ramp.
- Scale the raster pitch down at >=2dppx, where a 2px scanline is 4
device px and resamples into moire at fractional DPR.
- Raise --color-mg to oklch(0.62): at 0.5 it was 3.5:1 on the
background and 1.7:1 over the vignette centre. Halve the vignette
alpha via its own token, keeping --color-accent-transparent at 50%
for ProjectCard's glow.
Collapses the two keyframe blocks from 193 lines to 40.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
accessibility, and unify SVG fill color to #fff
Update BaseLayout to use a header <p> for the website title, rename the
main slot/id to
"main", and update all pages to match. Add CSS rule svg { fill:
currentColor }
and size header > p the same as h1. Fix a minor comment typo.
Replace single deploy/haproxy.cfg with deploy/haproxy/{haproxy.cfg,challenge.html}.
HAProxy now runs a WebCrypto-based proof-of-work challenge using a stick-table,
URI normalization and a challenge backend. docker-compose mounts the haproxy
directory, and also switches the site DB volume to ./db to be consistent. Update robots.txt.ts to
add a honeypot path for bad bot blocking.
Use absolute path for unscii-16 preload and remove unscii-8 preload.
Replace file favicon.svg with inline SVG data-URI favicon, using text emoji and coloring it lime
green.
For the footer, remove the current year copyright and replace with Creative Commons icons for
CC-BY-NC-SA license. Move the theme
x-data and parallax choosing logic from BaseLayout to parallax.astro
Add WireGuard-related env variables to .env.example (addresses,
keys, endpoint, DNS)
Resolve WIREGUARD_ENDPOINT_HOST to WIREGUARD_ENDPOINT_IP in
cicd/scripts/deploy.sh and write it to .env, failing if unresolved
Un-comment and enable the wireguard service in docker-compose.yml
Remove an obsolete commented workflow snippet
Introduce reset.css and theme.css and refactor style.css
to import them via layers; add Unscii font files and preload links.
Add RSS XSL/CSS and a css-test page; remove legacy snes.min.css.
Tweak BaseLayout and contact layout (preloads, grid gaps). Rename index.astro to parallax.astro and
created new basic index page. Improve input styles and contact form placeholders
Remove Google Fonts and the old external stylesheet link. Add (inline for now)
@font-face rules for unscii fonts and new link/p/ul styles, and set the
root font to unscii16. Minor UI tweaks: style the skip link background,
remove the "Tools" nav item for now, fix the contact page title and link
markup, and replace the homepage copy with an "Under Construction"
message.
Add a "reset" action to the form and clear session data when invoked.
Return a structured OTP error (nextAction: send_msg, field: otp, error: ...)
instead
of throwing so the UI can stay on the verification step. Remove noisy
console logs and include SMS provider message in service errors. Update
contact.astro to surface field-level errors, split the form into
fieldsets, add a "Go Back" reset button, and make small UI/layout tweaks.
validation
Use the Cap client widget in the contact UI with status icons and auto-solve,
replacing the capwidget element. Normalize and tighten phone validation by
splitting
normalizePhone and isValidPhone in the Otp lib and use it in contact action
validation. Replace loose text validation with a character-stripper helper.
Also bump several dependencies and adjust middleware to save and restore form
data for
form actions.
Implement send_otp and send_msg handlers with server-side validation,
captcha verification, OTP generation/verification, rate limiting,
session-backed multi-step flow, and SMS gateway integration.
Replace broken contact endpoint and types with Astro server actions;
delete endpoints/contact.ts, types/ContactForm.ts and
src/components/ContactForm.astro. Update pages/contact.astro to use
astro:actions and improve captcha handling (listen for solve and set
hidden input). Adjust OTP timing (step 60s → 300s, VALID_PAST_OTP_STEPS
5 → 1). Add validator, @types/validator, Prettier and
prettier-plugin-astro; include .prettierrc.mjs in tsconfig include.
Add Prettier config for Astro