Hi.
My name's Will.
I'm a front-end software engineer with a focus on TypeScript and JavaScript tooling. I enjoy creating efficient developer experiences to help deliver great customer experiences.
Welcome to my digital space.
Blog.
My thoughts, tips, and what not.
Curriculum vitae.

RS supplies industrial products: electronic components, automation and control, test and measurement equipment, engineering tools, and consumables via e-commerce, telephone and RS Local stores.
- 2022 — NowPrincipal Software Engineer
- 2020 — 2022Senior Software Engineer

A blockchain company that specialised in secure event ticketing and fungible token systems at scale.
- 2018 — 2020Software Engineer

A major British media and telecommunications company that offers television, broadband, and other communications services to residential and business customers.
- 2015 — 2018Front End Web Developer
- 2012 — 2015Support Analyst
- 2010 — 2012Test Analyst
My side projects.
2n8Minimal TypeScript state boilerplate. Primarily for use with React.
Helston Flora DayAn annual springtime festival in Cornwall, England, featuring traditional dances and celebrations. I designed and maintain the website.- Commits With CharacterA simple convention for conveying semantic versioning to both humans and automated systems via commit messages.
- WAIT! AnimateGiven a wait time, W!A calculates updated CSS keyframe percentages, allowing you to insert a delay between each animation iteration using pure CSS, without JavaScript.
Plastic ThemeA simple syntax and UI theme. Designed to be language-agnostic, with a small colour palette to avoid visual overload.
TingsA collection of small JavaScript utilities.- 5DiceTerminal based game of luck and strategy.
Browserosaurus [ARCHIVED]For macOS multi-browser users. Select from any of your installed browsers when clicking a link in a non-browser app. Now archived.
Links.
A list of interesting links I've found on my travels. Follow the RSS feed to be notified when I add more links.
2026
- 7 Signs a UI Has Been Vibe Coded (And How to Avoid Them)
- 13 lessons in 13 years
- SSG for React with Vite
- You should never be angry at work
- No Meat Proxy
- Don't paste the AI, please.
- AI;DR (AI; Didn’t Read) - Rick Manelius's Newsletter
- AI is removing the middle class of software engineering
- Kagi Search
- Dark mode toggles: two states are enough • Lea Verou
- Unexpected events and prosocial behavior: the Batman effect | npj Mental Health Research
- Don't be a meat proxy
- A system prompt to get AI to stop pretending to be human
- Octane — React's programming model, compiled
- There are no lossless transformations of natural-language text – Sophie Alpert
- no slop grenade
- Build desktop apps using Deno
- Nub — an all-in-one toolkit for Node.js
- How to schedule deploys with Netlify
- The O(n^2) Bug That Looked Like Clean Code
- How to Communicate
- I'm OK being left behind, thanks!
- aria-label is a code smell
- Create Your Own Web Development Conspiracy
- npmx — a better browser for the npm registry
- 🐹 Deep clean and optimize your Mac
- Stop turning everything into arrays (and do less work instead)
- Master React 19.2 Async Everywhere — Boost Performance
- Intro to Performance of React Server Components
- React Server Components: Do They Really Improve Performance?
- Sonner - An opinionated toast component for React.
- Date is out, Temporal is in
- Lottery Every Second
2025
- Hyper-Typing
- One Year with Next.js App Router — Why We're Moving On
- State-based vs Signal-based rendering
- You Don't Need Animations
- Optical Toys
- `vi.mock` Is a Footgun: Why `vi.spyOn` Should Be Your Default
- The Useless useCallback
- What makes a senior engineer
- Writing Code Was Never The Bottleneck
- I Used Arch, BTW: macOS, Day 1
- It's rude to show AI output to people
- diff-so-fancy
- Andreas Kling's Keynote Presentation on the Ladybird Browser
- Prefer gaps to margins
- UI Fonts - Test and Preview Fonts in Real-Time