2026
Canny Cart
A shopping list you talk to. It sorts what you said into aisles, reads your receipts, and works out where the money went.
Software engineer
2026
A shopping list you talk to. It sorts what you said into aisles, reads your receipts, and works out where the money went.
2026
An open-source library of distilled, reusable engineering practice for AWS Amplify, Next.js and Expo.
2025
A from-scratch drag-and-drop form engine — authoring, schema storage and a runtime renderer.
6 min read
The third montage, from the weeks around launch: the Android alert that silently drops its fourth button, a keyboard trap hiding in one prop, an HTTP 431 caused by cookies, sessions that survived a failed refresh badly, and the day the app got a space in its name.
5 min read
Two CSS systems, one cascade, and two one-line changes that each silently erased every input outline in the app. How CSS cascade layers make MUI and Tailwind coexist, why 'prepend: true' inverted the layer order, and why the bug only appeared behind the login.
6 min read
The web console shares the phone app's identity pool — so a valid sign-in proves nothing about belonging there. Building the front door that sends non-admins straight back out, the deletion queue with its runbook inline, tables that share one set of defaults, and the dark-mode fix that lived in a colour-maths exception.