← the shelf

Astro 6 · GSAP + ScrollTrigger · Lenis · rough.js · satori — statically built, deployed on Vercel. The full decision log lives in the repo as DECISIONS.md.

git is the database

Every rating is one Markdown file in the repo. Adding an entry = one file + one commit; the site rebuilds itself. No backend, no CMS, no login — the public site is read-only paper.

the art fetches itself

Movies & series carry a TMDB id; anime & manga an AniList id. At build time two small scripts pull the posters and covers, cache them, and the torn-paper frame is applied in code. Type an id → a cutout appears.

torn edges are a filter

The cutout edge is one SVG feTurbulence → feDisplacementMap filter shared by every image, with a hard drop-shadow that follows the tear. Figures with removed backgrounds get a traced white paper edge instead.

the scrapbook scrolls sideways

Opening a book expands it to full screen; vertical scroll drives horizontal motion through one collage panel per entry (GSAP ScrollTrigger, pinned + scrubbed, Lenis-smoothed). On touch and reduced-motion it degrades to native swipe-snap panels — and it works with JavaScript disabled.

hero moments rewind

Signature panels (Messi's goal, the 2022 final) stage their finished collage in CSS, then the scrub engine rewinds the layers and replays them as you scroll. No video — a ball, a hand-drawn net, and a GOAL!! burst, choreographed.

loud, but on rails

One fixed palette (paper, ink, six loud colors), exactly three type roles (Anton, Permanent Marker, Patrick Hand), one rough.js stroke config, one collage kit. Every screen uses 2–3 loud colors, rotating per section. Busy is designed; random is banned.

scores and tiers disagree on purpose

A 3/10 can sit in the WTF tier because "unrankable" is a real feeling. Nothing derives one from the other, and nothing ever will — that contradiction is recorded as a feature in the decision log.