About
I build AI products end-to-end as side projects and write down what actually worked. Everything on this site is built outside my day job — most of what I know about AI product management I learned the hard way: shipping a prototype, watching the model fail in edge cases, and realizing the UX had to change to mask the latency.
The highest-leverage PM decisions on these projects aren't about features — they're architectural trade-offs. I spend most of my time on three: what runs locally vs. in the cloud, what humans see vs. what agents call, and what the model is allowed to be wrong about. AquaSnap's free tier — unlimited identification — only works because I made those calls early: the 668-species classifier ships on the phone, where every scan costs zero.
UI still matters. AquaSnap couldn't just be a good model — it had to be an app a hobbyist could use one-handed, staring at a tank, while a fish does something weird. I optimize for the user's actual environment, not the clean mental model of the API.
I write the code, train the models, debug the RTX 3090 when it overheats during a long run. PM work that doesn't touch the machinery rarely converges fast enough on the right thing to build.
Learnings, in order of how often they bite me
- Eval loops beat prompt engineering. Building Pakkd, I stopped fiddling with prompts and built a generator → evaluator → retry loop instead. Treating model non-determinism as a quality dial rather than a bug changed how I build.
- Local models unlock business models. Pushing AquaSnap's 668-species classifier onto the device dropped my marginal cost per scan to zero. That architectural choice is the only reason the unlimited free tier can exist.
- Token costs dictate UX. On ThoughtTrails, Gemini-powered analysis worked beautifully but per-token costs meant I had to tightly gate the feature behind a subscription or bleed money. I now model unit economics before I design the UI.
- Free tier protects the hot path. Don't gate the loop that earns word-of-mouth. Gate scarcity — multiple tanks, deep diagnostic, video — instead.
- Three gates, then automate. I burned weeks on the same boilerplate across three side projects before realizing the only decisions that needed me were idea selection, spec approval, and shipping. The venture-studio framework is what fell out of that.
- Ship the highest-leverage hypothesis first. The version that proves the central bet on user value — not the version with every feature. Constraint forces clarity. Then watch what users actually do; surveys lie, daily-active doesn't.
- Beautiful UI is the product. The typography on AquaSnap's camera screen took five iterations because the species name and confidence had to land in the user's eye in the same fraction of a second the camera focused — too small and people didn't trust it, too big and it covered the fish. AI doesn't change this; it amplifies it.
Currently building & learning
AquaSnap on iOS and a venture-studio framework where scheduled Claude agents do most of the daily build. Spent two weeks recently exploring how far LLMs can carry an iOS app from spec to TestFlight — answer is further than you'd expect, with the right gates.
Currently testing Gemini 3.1 for diagnostic explanations, Vertex TPU v5e for training runs, PaliGemma and Llama 3 for offline visual + text inference, and Claude as the day-to-day pair on every codebase. Most of these notes end up on LinkedIn first.
Stack
React NativeExpoTypeScriptNode.jsPythonKeras 3PyTorchJAXTFLiteGeminiClaudeOpenAILlamaPaliGemmaCursorVS CodeClaude CodeFirebaseCloud FunctionsVertex AIRevenueCatSQLiteDrizzleFFmpegFastlaneEAS BuildGitHub Actions
