For a long time, the most honest description of my job was this: I made things that looked real but weren’t.
Interfaces that responded to a tap. Prototypes with spring physics and page transitions and little micro-interactions I’d obsess over for hours. Flows you could actually click through and, for a second, believe. But underneath, there was nothing. No data. No logic that survived a refresh. A beautiful shell, and I was the guy building the shell.
Framer was my upgrade from Figma. Instead of static frames, I could design the thing, make it move, and put it live at a real URL, which felt like magic the first time. It’s one of the best no-code tools I’ve ever used, and it was underrated for its time, even with its limits. I learned every corner of it, then went looking for the corners it didn’t officially have. Code components, overrides, little bits of JSX to make things behave. I was writing more code than I realized. I just didn’t call it that yet.
Framer was good to me. It gave me room to play with animations and interactions, and with a few code components I could pull off some pretty cool stuff.
But it had a ceiling. Some important things, like user logins, saving real data or talking to another service, would have been a piece of cake in a custom build and just weren’t there. I didn’t complain. I found workarounds, and when there weren’t any, I moved on and designed the next beautiful shell.
The moment the wall disappeared
I’ll just say it plainly: Claude Code broke the entire idea of development for me.
The first time I used it, I wanted a small tool. I described it. It got built. Not perfectly, not in one shot, but built. Real files, real code, something I could run and change and break and fix. For most of my career, the limit on what I could make wasn’t my taste or my ideas. It was turning them into something that runs. And suddenly the wall was a conversation.
So I started building. Small apps first. Then Chrome extensions, because you can’t fake your way through a manifest.json with vibes alone. Then websites with real logic behind them. Everything I used to fake or work around in Framer, I could now build for real.
The boring parts turned out to be the good parts
Nobody tells you this: the code getting written for you is the easy part. Everything around it is a craft of its own.
Git, for one. I thought I understood it until Emil opened Excalidraw and drew out how it actually works: branches, merges, worktrees, the whole map. That one drawing did more for me than every tutorial I’d skimmed.
Philip got me comfortable in the terminal, introduced me to Ghostty, which made my flow even faster, and showed me how to structure a project so future me at 1am can still find things. The whole dev team at Incredible was like that. They answered questions that were probably painfully basic and let me be bad at it in front of them. That’s most of why I stuck with it.
Being early helped too. Incredible is a small, voice-first AI company, and we lived inside these tools before most people had opinions about them: Claude Cowork, MCPs, Claude Code. That’s where my gut for AI-native work comes from. It isn’t talent. It’s reps.
Where this leaves me
I still design. I care about typography and motion and the feel of an interface exactly as much as I ever did. What moved is the ceiling. I don’t stop at the wall and look for a workaround anymore. I keep going.
Sometimes the code I ship is worse than a real engineer’s. But I’m learning, and I learn fast! And it exists and it works. Last year it would have been a mockup with a note that said “imagine this is interactive.” Claude Code didn’t teach me to code so much as remove the reason I always had for not learning.
And this is the worst these models will ever be. I have no idea where the ceiling is now, or if there even is one. For the first time in my career, that question is fun instead of frustrating.
I spent years designing things I couldn’t build. I’m not doing that anymore.