How this site was made.
Art direction, motion and design by Nicolae Herrera; built with Claude, Anthropic’s AI, as engineering partner, through the same seven steps as client work.
- 1,106commits in seven weeks to launch
- 1,106total commits
- 61components
- 17pages
- 26klines of code
- 110film and image scripts
- 395storyboard frames
The team and the tools
One designer, one AI partner, many iterations.
Nicolae directs it: the art direction, the motion and every call on what to make, how it feels and when it’s done. Claude does the hands-on build: writing the code, testing in a real browser and reporting back with screenshots and measurements. Imagery no camera could capture came from Figma AI and Google Gemini, then cut, graded and composited to his direction.
Claude, in Cowork
Anthropic’s AI as engineering partner: writes the code, runs the build, tests in a real browser, commits and writes the docs.
Figma AI
Still imagery that couldn’t be photographed: the seven synthetic portraits on the deepfakes case study (no real people), the embryo’s growth stages in the home hero, the butterfly in the Ellie Cashman film and a set of illustrated scenes.
Google Gemini
Source video behind several heroes (CVS Health, CareAcademy, MIT, Georgetown), then trimmed, graded and composited.
Cloudflare
Hosting on a global network: pages served from the data center nearest each visitor, HTTPS and security headers on every response.
Astro 5
Static pages, server-rendered, enhanced after paint.
GSAP + ScrollTrigger
Reveals and scroll-timed motion, in the site’s own motion package.
WebGL, canvas, SVG
The live backgrounds: shaders, particle fields, wireframes.
Python: OpenCV, NumPy, SciPy, MediaPipe
Film compositing, face alignment and morphs, vignettes, halftones.
ffmpeg
Video encodes (AV1, HEVC, H.264, VP9), posters and the logo-film storyboard frames.
Playwright + axe-core
Real-browser testing at desktop and phone widths, and accessibility scans.
Git + GitHub
Every change committed, with what changed and why.
The workflow
Ask, build, measure, look, commit.
Every change, small or large, went through the same loop, often several times an hour. It works for any designer and AI pairing: the person keeps the judgment, the AI does the work, and nothing counts as done until it has been rendered and checked.
- 01
Ask
A request in plain words, usually a cropped screenshot with the problem described, sometimes naming the CSS at fault (“line-height”). One change, or a short list.
- 02
Clarify
If it could mean two things, Claude asks in one line, or makes the call and says which call it made. Never a silent guess.
- 03
Edit where the files live
Changes go straight into the project on the designer’s computer, never into a copy that drifts.
- 04
Build
A full production build after every change. A warning counts as a failure.
- 05
Test the whole page
In a real browser from phone to laptop widths, once with reduced motion, then by Nicolae on a 24-inch monitor and a MacBook. The whole page, not just the change: nothing overflowing, no sideways scroll.
- 06
Measure, then look
Sizes, contrast and timing are measured, and both sides of a comparison are reported. Then the screenshot is actually read.
- 07
Report
What changed, the numbers and anything that went wrong, said plainly.
- 08
Commit and document
A commit with what and why; the docs, the hidden-content log and the list of traps updated in the same pass.
Step I of VII
Discovery and research
The site began as an inventory: every client and project since 1998, the old site’s pages and search traffic, and the sites it would sit beside. Reference sites were documented, the work was traced as a journey from 1998 to today, and baselines were set for search and accessibility.
- Content inventory since 1998
- Old-site audit
- Reference sites documented
- SEO baseline
- Accessibility baseline
Step II of VII
UX: structure and flow
Seventeen pages in a simple shape: home, work, case studies, the full list of past work, approach, contact and this page with its brand, motion and component guides. Every case study follows one template, so a visitor learns it once. Keyboard and screen-reader paths were planned with the layout, not after it.
- Information architecture
- Case-study template
- Work overlay
- Skip link and landmarks
- Keyboard paths
Step III of VII
UI and design systems
One design system in its own package: color, type, spacing and motion as tokens, with 13 sector colors and contrast measured against WCAG. Every component is built from it, so the last page is as considered as the first.
- @pure/tokens package
- Contrast-checked colors
- Inter Tight + Roboto Condensed
- Spacing and type scales
- 61 components
Step IV of VII
Interaction and motion design
Motion is treated like film editing. A section’s background waits until the section is well in view — its top past 65% of the screen — so each one arrives as a cut, not something already playing. Backgrounds are drawn live in WebGL, canvas and SVG, or composited as films; every one has a reduced-motion version. The storyboards below show them frame by frame.
With AIImagery generated with Figma AI and Gemini; Claude writes the shaders, canvas code and compositing scripts; the designer judges every frame, often from storyboards like these.
- @pure/motion package
- Split-text reveals
- WebGL shaders
- Canvas and SVG animation
- Composited films
- Reduced-motion variants
- Section start at 65%
395 frames · 27 storyboards · every frame has an ID
Home hero: the full sequence
Tessera, the home page’s opening: one flight through four worlds, from microbes to the Earth, with no cuts. Ninety frames, one every half second, with each scene change caught at three points.
-
-
HH-0010.0s
-
HH-0020.5s
-
HH-0031.0s
-
HH-0041.5s
-
HH-0052.0s
-
HH-0062.5s
-
HH-0073.0s
-
HH-0083.5s
-
HH-0094.0s
-
HH-0104.5s
-
HH-0115.0s
-
HH-0125.5s
-
HH-0136.0s
-
HH-0146.5s
-
HH-0157.0s
-
HH-0167.5s
-
HH-0178.0s
-
HH-0188.5s
-
HH-0199.0s
-
HH-0209.5s
-
HH-02110.0s
-
HH-02210.5s
-
HH-02311.0s
-
HH-02411.5s
-
HH-02512.0s
-
HH-02612.5s
-
HH-02713.0s
-
HH-02813.5s
-
HH-02914.0s
-
HH-03014.5s
-
HH-03115.0s
-
HH-03215.5s
-
HH-03316.0s
-
HH-03416.5s
-
HH-03517.0s
-
HH-03617.5s
-
HH-03718.0s
-
HH-03818.5s
-
HH-03919.0s
-
HH-04025%
-
HH-04150%
-
HH-04275%
-
-
-
HH-0430.0s
-
HH-0440.5s
-
HH-0451.0s
-
HH-0461.5s
-
HH-0472.0s
-
HH-0482.5s
-
HH-0493.0s
-
HH-0503.5s
-
HH-0514.0s
-
HH-0524.5s
-
HH-0535.0s
-
HH-0545.5s
-
HH-05525%
-
HH-05650%
-
HH-05775%
-
-
-
HH-0580.0s
-
HH-0590.5s
-
HH-0601.0s
-
HH-0611.5s
-
HH-0622.0s
-
HH-0632.5s
-
HH-0643.0s
-
HH-0653.5s
-
HH-0664.0s
-
HH-0674.5s
-
HH-0685.0s
-
HH-0695.5s
-
HH-07025%
-
HH-07150%
-
HH-07275%
-
-
-
HH-0730.0s
-
HH-0740.5s
-
HH-0751.0s
-
HH-0761.5s
-
HH-0772.0s
-
HH-0782.5s
-
HH-0793.0s
-
HH-0803.5s
-
HH-0814.0s
-
HH-0824.5s
-
HH-0835.0s
-
HH-0845.5s
-
HH-0856.0s
-
HH-0866.5s
-
HH-0877.0s
-
HH-0887.5s
-
HH-0898.0s
-
HH-0908.5s
-
Home section backgrounds
Each statement on the home page has its own background.
-
-
HS-ML-012.0s
-
HS-ML-024.5s
-
HS-ML-037.0s
-
HS-ML-049.0s
-
HS-ML-0511.5s
-
HS-ML-0614.0s
-
HS-ML-0716.0s
-
HS-ML-0818.5s
-
HS-ML-0921.0s
-
HS-ML-1023.0s
-
HS-ML-1125.5s
-
HS-ML-1228.0s
-
HS-ML-1330.0s
-
HS-ML-1432.5s
-
HS-ML-1535.0s
-
HS-ML-1637.0s
-
HS-ML-1739.5s
-
HS-ML-1842.0s
-
HS-ML-1944.0s
-
HS-ML-2046.5s
-
HS-ML-2149.0s
-
-
-
HS-TNX-010.0s
-
HS-TNX-021.0s
-
HS-TNX-032.0s
-
HS-TNX-043.0s
-
HS-TNX-054.0s
-
HS-TNX-065.0s
-
HS-TNX-076.0s
-
HS-TNX-087.0s
-
HS-TNX-098.0s
-
HS-TNX-109.0s
-
HS-TNX-1110.0s
-
HS-TNX-1211.0s
-
-
-
HS-CVS-010.0s
-
HS-CVS-0219.3s
-
HS-CVS-0319.6s
-
HS-CVS-0419.8s
-
HS-CVS-0520.1s
-
HS-CVS-0620.4s
-
HS-CVS-0720.7s
-
HS-CVS-0820.9s
-
HS-CVS-0921.2s
-
HS-CVS-1021.5s
-
HS-CVS-1121.8s
-
HS-CVS-1222.0s
-
-
-
HS-NASA-010.0s
-
HS-NASA-021.0s
-
HS-NASA-032.0s
-
HS-NASA-043.0s
-
HS-NASA-054.0s
-
HS-NASA-065.0s
-
HS-NASA-076.0s
-
HS-NASA-087.0s
-
HS-NASA-098.0s
-
HS-NASA-109.0s
-
HS-NASA-1110.0s
-
HS-NASA-1211.0s
-
-
-
HS-ECD-010.0s
-
HS-ECD-0213.8s
-
HS-ECD-0331.6s
-
HS-ECD-0432.6s
-
HS-ECD-0533.8s
-
HS-ECD-0634.9s
-
HS-ECD-0736.1s
-
HS-ECD-0837.1s
-
HS-ECD-0938.1s
-
HS-ECD-1039.3s
-
HS-ECD-1140.6s
-
HS-ECD-1241.6s
-
-
-
HS-LHRP-010.0s
-
HS-LHRP-021.0s
-
HS-LHRP-032.0s
-
HS-LHRP-043.0s
-
HS-LHRP-054.0s
-
HS-LHRP-065.0s
-
HS-LHRP-076.0s
-
HS-LHRP-087.0s
-
HS-LHRP-098.0s
-
HS-LHRP-109.0s
-
HS-LHRP-1110.0s
-
HS-LHRP-1211.0s
-
HS-LHRP-1312.0s
-
Case-study heroes
The background behind each case-study title.
-
-
C-TNX-010.0s
-
C-TNX-021.5s
-
C-TNX-033.0s
-
C-TNX-044.5s
-
C-TNX-056.0s
-
C-TNX-067.5s
-
C-TNX-079.0s
-
C-TNX-0810.5s
-
C-TNX-0912.0s
-
C-TNX-1013.5s
-
C-TNX-1115.0s
-
C-TNX-1216.5s
-
-
-
C-ML-010.0s
-
C-ML-021.0s
-
C-ML-032.0s
-
C-ML-043.0s
-
C-ML-054.0s
-
C-ML-065.0s
-
C-ML-076.0s
-
C-ML-087.0s
-
C-ML-098.0s
-
C-ML-109.0s
-
C-ML-1110.0s
-
C-ML-1211.0s
-
C-ML-1312.0s
-
C-ML-1413.0s
-
C-ML-1514.0s
-
C-ML-1615.0s
-
C-ML-1716.0s
-
C-ML-1817.0s
-
C-ML-1918.0s
-
C-ML-2019.0s
-
C-ML-2120.0s
-
-
-
C-CVS-010.0s
-
C-CVS-021.6s
-
C-CVS-032.3s
-
C-CVS-042.9s
-
C-CVS-053.6s
-
C-CVS-064.3s
-
C-CVS-075.5s
-
C-CVS-086.7s
-
C-CVS-097.7s
-
C-CVS-108.4s
-
C-CVS-118.9s
-
C-CVS-129.5s
-
-
-
C-MIT-010.0s
-
C-MIT-021.1s
-
C-MIT-032.2s
-
C-MIT-043.3s
-
C-MIT-054.4s
-
C-MIT-065.5s
-
C-MIT-076.6s
-
C-MIT-087.7s
-
C-MIT-098.8s
-
C-MIT-109.9s
-
C-MIT-1111.0s
-
C-MIT-1212.1s
-
C-MIT-1313.2s
-
C-MIT-1414.3s
-
-
-
C-ECD-010.0s
-
C-ECD-021.2s
-
C-ECD-032.4s
-
C-ECD-043.6s
-
C-ECD-054.8s
-
C-ECD-066.0s
-
C-ECD-077.2s
-
C-ECD-088.5s
-
C-ECD-099.6s
-
C-ECD-1010.8s
-
C-ECD-1112.0s
-
C-ECD-1213.2s
-
-
-
C-LHRP-010.0s
-
C-LHRP-022.2s
-
C-LHRP-034.4s
-
C-LHRP-046.6s
-
C-LHRP-058.8s
-
C-LHRP-0611.0s
-
C-LHRP-0713.2s
-
C-LHRP-0815.4s
-
C-LHRP-0917.6s
-
C-LHRP-1019.8s
-
C-LHRP-1122.0s
-
C-LHRP-1224.2s
-
-
-
C-NASA-010.0s
-
C-NASA-021.5s
-
C-NASA-033.0s
-
C-NASA-044.5s
-
C-NASA-056.0s
-
C-NASA-067.5s
-
C-NASA-079.0s
-
C-NASA-0810.5s
-
C-NASA-0912.0s
-
C-NASA-1013.5s
-
C-NASA-1115.0s
-
C-NASA-1216.5s
-
-
-
C-CA-010.0s
-
C-CA-020.8s
-
C-CA-031.6s
-
C-CA-042.4s
-
C-CA-053.2s
-
C-CA-064.0s
-
C-CA-074.8s
-
C-CA-085.6s
-
C-CA-096.4s
-
C-CA-107.2s
-
C-CA-118.0s
-
C-CA-128.8s
-
C-CA-139.6s
-
C-CA-1410.4s
-
C-CA-1511.2s
-
C-CA-1612.0s
-
C-CA-1712.8s
-
C-CA-1813.6s
-
C-CA-1914.4s
-
C-CA-2015.2s
-
Work logo films
The short films on the work page, each ending on the client’s mark.
-
-
W-TNX-010.0s
-
W-TNX-020.5s
-
W-TNX-031.1s
-
W-TNX-041.6s
-
W-TNX-052.2s
-
W-TNX-062.7s
-
W-TNX-073.3s
-
W-TNX-083.8s
-
W-TNX-094.3s
-
W-TNX-104.9s
-
W-TNX-115.4s
-
W-TNX-126.0s
-
-
-
W-ML-010.0s
-
W-ML-020.3s
-
W-ML-030.6s
-
W-ML-040.9s
-
W-ML-051.2s
-
W-ML-061.4s
-
W-ML-071.8s
-
W-ML-082.0s
-
W-ML-092.3s
-
W-ML-102.6s
-
W-ML-112.9s
-
W-ML-123.2s
-
-
-
W-CVS-010.0s
-
W-CVS-020.6s
-
W-CVS-031.2s
-
W-CVS-041.8s
-
W-CVS-052.4s
-
W-CVS-062.9s
-
W-CVS-073.5s
-
W-CVS-084.1s
-
W-CVS-094.7s
-
W-CVS-105.3s
-
W-CVS-115.9s
-
W-CVS-126.5s
-
-
-
W-MIT-010.0s
-
W-MIT-020.6s
-
W-MIT-031.1s
-
W-MIT-041.7s
-
W-MIT-052.3s
-
W-MIT-062.8s
-
W-MIT-073.4s
-
W-MIT-084.0s
-
W-MIT-094.5s
-
W-MIT-105.1s
-
W-MIT-115.6s
-
W-MIT-126.2s
-
-
-
W-ECD-010.0s
-
W-ECD-020.6s
-
W-ECD-031.3s
-
W-ECD-041.9s
-
W-ECD-052.6s
-
W-ECD-063.2s
-
W-ECD-073.8s
-
W-ECD-084.5s
-
W-ECD-095.1s
-
W-ECD-105.8s
-
W-ECD-116.4s
-
W-ECD-127.0s
-
-
-
W-LHRP-010.0s
-
W-LHRP-020.7s
-
W-LHRP-031.4s
-
W-LHRP-042.0s
-
W-LHRP-052.7s
-
W-LHRP-063.4s
-
W-LHRP-074.0s
-
W-LHRP-084.7s
-
W-LHRP-095.4s
-
W-LHRP-106.1s
-
W-LHRP-116.7s
-
W-LHRP-127.4s
-
-
-
W-NASA-010.0s
-
W-NASA-020.3s
-
W-NASA-030.6s
-
W-NASA-040.9s
-
W-NASA-051.2s
-
W-NASA-061.4s
-
W-NASA-071.8s
-
W-NASA-082.0s
-
W-NASA-092.3s
-
W-NASA-102.6s
-
W-NASA-112.9s
-
W-NASA-123.2s
-
-
-
W-CA-010.0s
-
W-CA-020.5s
-
W-CA-031.0s
-
W-CA-041.5s
-
W-CA-052.0s
-
W-CA-062.5s
-
W-CA-073.1s
-
W-CA-083.6s
-
W-CA-094.1s
-
W-CA-104.6s
-
W-CA-115.1s
-
W-CA-125.6s
-
Details
Smaller moments elsewhere on the site, framed close.
-
-
A-BOW-010.2s
-
A-BOW-020.5s
-
A-BOW-030.7s
-
A-BOW-041.0s
-
A-BOW-051.2s
-
A-BOW-061.5s
-
A-BOW-071.8s
-
A-BOW-082.1s
-
A-BOW-092.4s
-
A-BOW-102.8s
-
A-BOW-113.4s
-
A-BOW-124.4s
-
Step V of VII
Stories and acceptance criteria
Every change starts as a requirement and ends checked against it.
With AIEach chat request sets the acceptance criteria, and the result is checked against the request, not against the change.
- Requirements per change
- Hidden-content log: 10 entries
- Regression checks for every fix
- Fixes broken on purpose to prove the check
- Every page compared before and after
Step VI of VII
Build, QA and debugging
An Astro 5 monorepo that builds to static pages. Heavy animations have a seek hook, so tests and storyboards can stop on an exact moment.
With AIThe designer reviews the result, not the code.
- Static build
- Edge-hosted contact form
- Monorepo: site, tokens, motion
- Browser tests at 1440, 820 and 390
- Every control clicked: no dead buttons
- Low Power Mode simulated
- Pinch zoom on a real iPhone
- Accessibility scans
- Crawl for broken links
- Four film encodes
- Scripted compositing
Step VII of VII
Release and refine
In seven weeks to launch, 1,106 commits; 1,106 in all so far. Every push to GitHub builds and deploys on Cloudflare, with a private preview for each branch. Search and AI crawlers get the same care as people: structured data, a sitemap with images, social cards and an llms.txt.
With AIFeedback rounds take minutes, not days, so another version is always cheap to try.
- Structured data
- Image sitemap
- llms.txt
- WCAG 2.2 AA
Iteration
Most things took more than one try.
Version counts are kept on purpose: superseded versions are archived, not deleted, and the storyboards above show only the final ones.
32 versions
CareAcademy logo film
11 versions
The Georgetown film
3 passes
CareAcademy: her smile, in dots
18 versions
Ellie Cashman film
8 rounds
The NASA wing
2 concepts
The yarn bow
1 cinematic rule
Timing and delivery
Film and animation
Crystal clear took a process.
The first films looked fine in an editor and fell apart on the page: banding in dark gradients, hard edges, blocks in Safari, stale cuts in the cache. This is the pipeline every film and background goes through now.
- 01
Start from the source
Footage from Gemini or the client, stills from Figma AI. Every cut is rendered from the source frames, never from an earlier encode, so quality never drops version to version.
- 02
Composite in code
Python grades, masks and composites each frame: vignettes, halftones, face alignment and morphs. Nothing is done by hand twice.
- 03
Feather into the page
Edges fade into the page’s own black over a long, soft falloff, with a trace of noise so the fade has no steps. The film ends where the page begins, with no visible frame.
- 04
Storyboard it
Frames pulled at fixed moments and judged side by side, every version numbered. Reviewing a strip is faster and more honest than scrubbing a video.
- 05
Encode four ways
10-bit AV1 and HEVC first, so dark gradients stay smooth, then H.264 and VP9 for every other browser. Each browser plays the best one it can.
- 06
Check before it ships
Scripts confirm the length, that the edges match the page and that every format loads on every page, in Safari’s engine as well as Chrome’s.
- 07
Stamp and ship
Each file’s address carries a fingerprint of its contents, so a re-cut film is never served stale from a visitor’s cache.
Lessons learned
Banding is an 8-bit problem
Dark gradients in ordinary 8-bit video break into visible steps. 10-bit encodes and a little dither fixed what no amount of re-grading could.
Safari draws fades differently
Chrome smooths gradients over near-black; Safari doesn’t, in CSS or in canvas, and shows vertical blocks where Chrome is smooth. Those fades are now computed pixel by pixel with a little noise (dithered) and checked in Safari’s engine.
Test where the problem shows
A check in the wrong browser passes every time. Visual bugs are now reproduced first, then fixed, then checked in the browser that showed them.
Edges belong to the film
A mask added on the page reads as a hole; an oval vignette reads as a lens. Feathering inside the film itself lets it dissolve into the page.
Endings need restraint
A hold that feels right in an editor drags on a page. Several films were cut by half a second to a full second, and every ending now hands off: footage into dots, a film into its still.
A veil can band on its own
Even a fade in the page’s own color shows steps over an empty area, and masks over a dark print band in rings. Where a drawing has empty space, it now fades itself; where a mask fades an image, the mask carries a little noise.
A new cut needs a new address
Browsers keep a film for up to a year. When a film was re-cut but kept its old file name, anyone who had seen it kept getting the old version. Now each film’s address carries a short fingerprint of the file itself, so a new cut always loads fresh.
Core Web Vitals
Fast is measured, not felt.
Core Web Vitals are how Google measures what visitors feel: how soon the main content shows (Largest Contentful Paint, good under 2.5s), how quickly a tap answers (Interaction to Next Paint, under 200ms) and whether the page holds still (Cumulative Layout Shift, under 0.1). Every page was timed in Chrome on a Mac, on the live site, and in Lighthouse on a throttled phone, then fixed where it was slow. Each fix got a check that fails if it’s undone.
0.7s
Slowest case study to its largest paint (LCP), desktop, on the live site
0
Layout shift (CLS) on every page
56ms
Slowest response to a click (INP)
30ms
Time to first byte, from Cloudflare’s edge once a page is cached there
4.5×
Shorter longest task on the NASA explorer, on a throttled phone
How pages are kept fast
Content first
Headlines and text are in the page itself and paint with it, never waiting on a script to appear.
Media sized for the screen
Images and films in modern formats, a lighter cut for phones and nothing below the fold loaded before it’s needed.
Nothing jumps
Space is held for every image, film and font, so the page holds still as it loads.
Taps answer at once
Heavy work is split into small pieces between frames, so the page responds while it’s still loading.
Measured, not assumed
Lighthouse on a throttled phone, Chrome’s own timings on real devices and before-and-after comparisons run side by side.
Lessons learned
A title waiting on a script is a slow title
Hero titles were split into words by JavaScript, so on a slow phone they appeared only after the scripts had run. They’re now split when the site is built and revealed in CSS from the first paint, with one copy of the text that screen readers read as a sentence.
Chrome doesn’t count what starts invisible
Text first painted fully transparent isn’t counted as shown until something repaints it, so the measure was random. Reveals now start at 1% opacity, which no one can see, and the measure matches what visitors see.
Preloading can make it slower
Fetching the MIT hero film early competed with the fonts and scripts and made the phone slightly slower. It was tried, measured and reverted.
One long task stalls everything
The NASA explorer built its grids in one block of over a second on a phone. It now builds them in small slices between frames, and its second zoom level only when it’s first used.
Compare in the same run
Lab scores drift by as much as the change being measured. Before and after now run side by side, on the same machine, several times.
A pinch zoom can run a phone out of memory
Pinch-zooming the home page on an iPhone 14 made Safari and Chrome reload it: every section kept its moving background ready to redraw at the zoomed size. The cause was found on the phone itself, by turning off one kind of layer at a time: backgrounds, animations, masks, films. Now a section far from view rests, and while the page is zoomed the section backgrounds step aside and return at normal size. The case studies never had the problem.
The home page waits on purpose
Its headline arrives with the film, because the choreography is the point. It now starts as the film’s first glide begins rather than after it ends, 3.6s sooner.
Rules that made it faster
Written down once, applied everywhere.
Every correction that could happen twice became a rule, kept in a working-notes file the AI reads before every session and in the project’s docs. That is what made the pace possible: the same feedback never had to be given twice.
Working together
- Ask in one line, or make the call and name it.
- Say plainly when something was wrong.
- The best brief: a cropped screenshot (circled or not) and a line on what’s wrong.
- Hide means keep: comment it out and log it, never delete.
Quality
- Check the whole page, not just the change.
- Measure, don’t estimate, and report both sides of a comparison.
- Every bug fix gets a check, proven by breaking the fix on purpose.
- A check that skips quietly is worse than none: a missing target fails.
- Desktop and phone every time; reduced motion is its own version.
- Time it on a throttled phone, not only a fast desktop.
Design
- Tokens, not literals.
- No browser-default controls: custom, and fully keyboard accessible.
- A section’s background starts once its top passes 65% of the screen.
- Sentence case; acronyms like UX, UI and IxD as they are written.
- No rule above the first item in a list or below the last.
- Scrollbars are thumb only; video vignettes are soft, never an oval.
- Links and buttons show the lime arrow cursor, never the system hand.
Engineering
- Edit files where they live; build after every change.
- Server-render the real content; enhance after paint.
- Heavy animations get a seek hook, so tests stop on an exact moment.
- Every trap that cost time is written down once, in notes the AI reads before each session.
- Commit after every change, with what and why.
More about this site