Grain

Film grain over one section. A greyscale noise tile jumps between eight offsets every --duration-slow on the Web Animations API, pauses off-screen, and reads as texture rather than motion.

npx shadcn add @gc/grain

One ambient effect per viewport

Texture that sits under the content, never on top of it.

Soft-light blend, so it darkens the paper theme and lightens graphite by the same amount. Turn it still to see the texture without the flicker.

Craft score

Measured on b38543d. All scores

Perf mobile
96
Perf desktop
100
CLS
0
LCP mobile
2763 ms
Gzipped source
1.4 kB
Reduced motion
Pass