This site uses one functional cookie to keep feature rollouts consistent for you. Nothing is set until you choose. See the privacy notice.
Dev notes
A résumé says “strong performance skills.” Anyone can. The Craft page tries the opposite: name the traits a lead front-end developer is actually measured on, then hang each one off something in this project you can open and check. Fewer adjectives, more receipts.
This whole site is already the portfolio. Every feature and every dev-note is a small argument for some competency, but that argument is scattered. Someone skimming the hub sees a calendar and a Pokédex, not “system design” or “type safety.” The Craft page is the missing index: it names the trait, then points at the proof. It turns a pile of demos into a claim with citations.
The traits themselves are the ones that separate a senior who ships from a lead who is trusted with the shape of the whole front end: Performance, System Design, Working with Libraries, Accessibility, Testing & Quality, Type Safety, Design Systems, Security, Build & Tooling, Mentorship & Review.
The design rule was simple: no trait ships without at least two pieces of evidence, and every piece of evidence is a real, reachable page. “Performance” links to the live Web Vitals dashboard and the write-ups on bundle size, render cost, and tree shaking. “Working with libraries” links to the Motion and Particle labs and the note on why this site drops Apollo for a plain fetch. The page argues from things you can click, not from a list of buzzwords.
The risk with a page like this is rot. A write-up gets renamed, a route moves, and suddenly “proof” is a 404. So the trait data lives in src/lib/craft.ts and a test walks every evidence link and asserts it resolves to a real feature href, a real dev-note href, or a small allow-list of known routes.
FEATURES and THOUGHTS arrays means a dead evidence link fails CI, not the reader.Each trait is a header button that owns its aria-expanded state and points at the panel it controls with aria-controls, so the whole matrix is operable from the keyboard with a visible focus ring. Everything starts expanded so nothing hides behind a click, a single toggle collapses or expands the set, and the reveal animation is gated on prefers-reduced-motion. A vitest-axe scan in the test suite fails the build on a violation.
Right now the traits are hand-ordered and self-selected, which is honest but subjective. A future version could weight each trait by how much evidence actually backs it, or let a reader filter the hub by the trait they care about. For now the goal was smaller and worth doing on its own: make the implicit claim of the whole site explicit, and make it impossible to leave a broken citation behind.