The best product decisions survive implementation. I design with the browser, real content, and awkward edge cases in mind from the start—not because every designer needs to become an engineer, but because the medium should influence the idea.

One connected practice

Product thinking sets direction. Interface design creates hierarchy. Motion explains change. Code reveals whether the system still holds together when the screen gets smaller, the title gets longer, or the network gets slower.

I move between rough flows, detailed screens, and small coded prototypes. Each exposes a different mistake: a missing decision, weak emphasis, or an interaction that looked elegant in a static frame but feels tiring after the fifth use.

Moving between structure, interface, and implementation keeps the work honest.
Moving between structure, interface, and implementation keeps the work honest.

Design the difficult states

The real character of a product appears in loading, empty, error, permission, and recovery states. These moments need calm language and clear choices because the user is already uncertain. Designing them early makes the whole system more dependable.

A polished screen is not the finish line. A coherent experience is.

When interface and code evolve together, responsiveness, accessibility, motion, and performance stop feeling like additions. They become part of the concept itself.