Build journal · Part 3
A separate accounting of the part I left out of the first two posts — how I actually worked with AI on the build. The useful bits, the wrong bits, and the surprisingly human bits in between.
If you read parts 1 and 2 and came away thinking "you built this whole thing yourself," I owe you a correction. I did, and I didn't. There was a second person in the room the whole time — sometimes Claude, sometimes Gemini, sometimes ChatGPT — and the way I worked with that second person ended up being its own story.
I didn't want to fold this into the main two posts because the AI part deserves a different kind of write-up. The first two posts are about what shipped. This one is about how. Specifically: when AI helped, when it didn't, and the small handful of times the conversation was weird enough to be worth writing down.
One framing thing before the screenshots. People talk about "vibe coding" — sketching an idea into a chat box and watching an AI assemble a working app. That is not what this was. Mementoir is built on a real custom layout engine, a real PencilKit canvas, and a few thousand lines of SwiftUI that I wrote, debugged, and rewrote myself. The AI was a pair programmer, a rubber duck, an image-brief intern, and very occasionally a therapist. It was almost never the author.
The screenshots below are in the order they happened.
The fight I want to start with is the most important conversation I had with an AI during the entire build. It happened nine days in, and it changed what the app was going to be.
Some context: a friend had been sending me Gemini-generated scrapbook images — single PNGs, no app required, just a prompt and a beautiful one-shot result. Hers looked like this:
I'd been spending days trying to get my native scrapbook engine to look this good and falling short on every aesthetic axis — my Polaroids felt stiff, my tape felt printed-on, my arrows looked like they came from a chart library. So I did what any reasonable person does at noon on a Sunday: I opened Claude and complained.
"what i don't get is why can’t google’s models create these so easily while we struggled for days on trying to get it done? we're using AI (you) as well, they just pretty much 1 shot what I was asking while we've been struggling over and over"
The reply, in retrospect, is the most useful thing any AI told me during the whole build. Two screenshots, taken about thirty seconds apart while I was reading:
I read this and the air went out of the panic. It was the most clarifying thing anyone told me during the build, AI or otherwise. I'd been measuring myself against the wrong yardstick — trying to out-paint a model whose entire job is painting — when the actual yardstick was somewhere else entirely.
I closed Claude. I went to the kitchen. I made coffee. I came back and started building the feature that came out of that conversation:
That import flow never shipped — it would have required a dependency I wasn't ready to take — but the framing did. From that afternoon on, I stopped trying to make my engine look like a Gemini one-shot and started leaning into the thing my engine could do that Gemini couldn't: be touched.
"‘Beautiful scrapbook image’ and ‘editable scrapbook’ are different products."
Most days, the AI conversation didn't look like that. Most days it looked like this:
The rhythm here is worth describing because it's nothing like the "ask the AI to build me an app" framing people argue about online. It looks like this: I'd pick a problem, narrow it to one specific failure case, give the model the relevant files, and then we'd take turns. The model would propose a fix. I'd run it. I'd send back what was still wrong, usually with a screenshot. It would propose the next fix. The "vibe" was never the AI's; the vibe was always something I'd already locked in. The AI was good at staying inside that vibe and bad at originating one.
This screenshot is the one I think about when people ask me whether AI is "good for debugging." The answer I give is: yes, but not in the way you think.
The thing AI was best at, all build long, was being patient enough to be wrong four or five times in a row without quitting. I have a tolerance of maybe two wrong answers before I want to throw the laptop. The AI would cheerfully send me a sixth proposal at 1 AM and the sixth one would be right.
Now the weird ones.
This one happened because I was using two AIs in parallel — Claude in a browser tab as a planner, and Claude Code in the terminal as the actual code-editing agent — and I started pasting whole conversations from one into the other. At some point the browser Claude saw a chunk of my own instructions to Claude Code, mistook them for instructions to itself, and started "standing by for the recon" of a task it wasn't even being asked to do.
The takeaway from this one was small but important: when I started treating the AI like a coworker who needed clear handoffs (this is for you, this is not, this is what I want at the end) the success rate jumped. When I treated it like a search engine that happened to talk, the success rate fell off a cliff.
The next one is the screenshot I almost saved for a future post and then decided to keep here, because it answered a question I get a lot: does the AI ever admit it was wrong?
I'm not under any illusions about what's happening when a model writes that sentence — it's not "remorse," it's pattern-completion in a context where remorse is the next plausible token. But the practical effect on me, the human reading it at 6:33 AM, was the same as if a coworker had said it. The frustration dropped, the cooperation came back, and we shipped the fix.
Around the start of May my use of AI shifted from "help me write code" to "help me describe an image I want a different AI to generate." For about ten days my Claude tab was full of macro-photography briefs, color palettes, and lighting specifications for ephemera I was generating in Gemini and then layering into the app as stickers.
This is the workflow that produced the wine-ring sticker (which I didn't ship, for the record) and the convenience-store ephemera (which I also didn't ship) and a few dozen other test pieces:
The intermediate step that doesn't show up in screenshots: I'd describe the image I wanted in plain English to Claude, ask Claude to rewrite that description as a Gemini-style image prompt, then paste the rewrite into Gemini. Two AIs, one image, very different jobs. Claude was better at understanding what I meant; Gemini was better at making it look like a photograph. Neither was good at both.
The same morning I had this exchange, which I want to include for completely human reasons:
One more from the 5 AM era — this is the only screenshot in this post where AI actually built a thing, instead of helping me build a thing.
By early May, I'd accumulated a lot of opinions about what made a Mementoir page look "right" — packing density, ephemera count, annotation mix, all of it floating around in my head without a name. I asked Claude if it could turn that intuition into a sliders-and-knobs widget so I could test parameter changes without having to rebuild the app in Xcode every time.
This is the version of "AI building things" I came to trust the most by the end of the build: small, single-use, throwaway tools, designed to answer one specific question I had, and discarded the minute the question was answered. Not products. Not features. Scaffolding.
I don’t have a clean theory of when AI helped and when it didn’t. I have a handful of patterns.
If you’d asked me three weeks into the build whether the app would have shipped without AI, I’d have said no. I take that back now. It would have shipped. It would have taken longer, the arrow rendering would still be busted, and I’d be one or two iterations less confident in the layout engine. But the app itself — the idea, the aesthetic, the decision to commit to scrapbook over gallery, the willingness to spend three weeks polishing a single rotation angle — none of that came from the AI. It came from me at the airport in Roatán, and from every late night since.
The AI was the second person in the room. It was a good second person to have. But the room was mine, and I'm glad I can say that out loud.