
Validity EngagePassword protected
Modular, on-demand fixes for an AI email QA platform
Ryan Magalhaes · Boston, MA
Senior product designer with 10+ years across product, brand and web. I lead 0-to-1 work on complex, technical products.
Side projects, mostly to learn a new tool by building with it.
A small browser game starring Sage, my one-ear-up island dog, who will chase a tennis ball until the sun goes down.
A working drum machine in the browser, modeled on classic hardware like the 808. I grew up playing drums.
A tool for logging design decisions as they happen and sharing them with a link. Since retired, but worth the lessons.
I'm a senior product designer with more than 10 years of experience, most of it spent making complicated things clear. Today that means 0-to-1 product work on an AI platform at Validity. Before that, I designed developer onboarding at Akoya and led brand and web projects at agencies.
That range is how I work. I can run the research, set up the design system, prototype in code, and design the identity and website that carry a product to market. Alongside full-time work, I still take on brand, web and product projects.
A tool for logging design decisions as they happen and sharing them with a link. Since retired, but worth the lessons.
I heard someone on a podcast say they just build useful tools for themselves. That stuck with me.
I wanted somewhere to log what I'm working on, the decisions I'm making and why, and what I'm learning, as it happens, then share a read-only link with anyone who wants to follow along. No one asked for it. It was an excuse to get more hands-on with AI tooling.
Day one: React, Vite, Tailwind, Supabase and Motion, built in Cursor and deployed on Vercel. A personal tool, just for me.
Day two I opened it up to other people, which meant a real rebuild, and an excuse to try Laravel. Auth, routing and much of the backend come out of the box, and AI tooling handled troubleshooting in real time, so what could've been a weekend of chasing errors was just building. The toughest call was hosting: I connected it back to Supabase for cost and deployed on Laravel Cloud.
Onboarding was guided and task-based: you created your first entry as part of getting set up, instead of landing in an empty feed.

The logging input at the bottom of the feed. Type, press Enter, entry logged. Hit expand and it grew in place into the full form, without losing what you'd typed.
The first version swapped between two components and felt janky. Rebuilding it as one component, where fields reveal through height and opacity, fixed it: nothing unmounted, it just showed more of itself. Content exited before the container shrank, 150ms of ordering that changed how it felt. And custom cubic-bezier curves replaced bouncy springs: expansions drifted in slow, collapses snapped out fast.
I've since pulled it down rather than keep paying for hosting. But shipping something real in a weekend, with a new framework, a proper backend, multi-user auth and real onboarding, was worth it. Learn by doing, then do it again.