
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 floating table of contents that highlights where you are on the page, built after hearing about it on a podcast.
I was listening to the Dive Club podcast and one of the guests, Tommy Smith, shared his portfolio. It had a table of contents that highlighted where you were on the page as you scrolled. Simple, but it felt really intentional. I wanted that.
It ran as the floating navigation in the bottom-left corner of my Framer portfolio.
The constant talk about AI replacing designers was getting into my head. Rather than keep reading about it, I wanted to use it as fuel and actually build something: small enough to tackle at night after my day job, and useful right away.
I used Cursor with Claude as the agent, and was specific from the start: it had to be a Framer component, with spacing and timing controlled from Framer's property panel. Being upfront about that made the first output close to usable.
Scroll behavior was the main headache: early versions fired at the wrong time and fought Framer's own scroll handling. What helped was describing the behavior I wanted in plain language ("my desired behavior is…") instead of fixing lines of code.
For the animation feel, I found bezier curves on easing.dev and gave the values to the agent. Something concrete beat "make it smoother".