Bubbi and WatchEnhance: Two Products I Just Shipped

By ·

Halfdan Harring just shipped Bubbi, a baby tracker and white-noise app for iPhone, and WatchEnhance, a watch-photo studio for dealers — both vibe coded.

I’m Halfdan Harring, a full-stack developer from Aarhus, Denmark. I just shipped two products: Bubbi, a baby tracker and white-noise app for iPhone, and WatchEnhance, a studio for watch-listing photos. Both are live. Both were built solo with the vibe coding workflow I use for everything else on this site.

New URLs are the honest way to announce anything. Here they are, with what each one actually does — and what vibe coding had to carry that the usual React stack does not.

Bubbi — the day, the log, and a sound that starts on a tap

Bubbi is on the App Store as Bubbi: Baby Tracker. The job is the day: write down when they eat and when they sleep, see the next nap and the next feed, and start white noise with one tap. Two parents can share the same log. Memory Wall looks at photos already on the phone, from the birthday forward, and puts each one in the week it was taken.

What it is not: a baby monitor, a medical device, or an app that listens to the room. The player is playback only. Six sounds — Rhythmic Shush, Womb Whoosh, Whisper Count, Ocean Waves, Dark Noise, Classic White — start when you tap them. Timers fade them. Nothing is uploaded from the microphone, and the wall never leaves the phone.

Free. No ads. Nothing to buy. Sign in with Apple is optional; the log works without an account.

The interesting part for this site is the stack. Almost every other app I ship is one React codebase on Capacitor. Bubbi is native SwiftUI, with Firebase only for the optional shared log. Vibe coding still wrote most of the code. The judgment — what a 3 a.m. parent is allowed to see, what a listing must never claim, what stays on-device — stayed mine. That is the same split as every other product. The language changed. The loop did not.

WatchEnhance — a listing photo that is still that watch

WatchEnhance takes the phone photo a dealer already has and turns it into a studio listing image. Soft light, a clean background, a real shadow. Chrono24, eBay, WhatsApp, a boutique site — same export, ready to go up.

The product exists because a chat-box image model will happily redraw a Rolex. Pretty picture. Wrong watch. WatchEnhance is the opposite bet: enhance the metal and the scene, then prove the dial is still this dial. Print, logo, hands and date are checked against the original photo. If a rose-gold case tries to come back steel, the result is thrown away. If the photo is too blown-out or too blurry to trust, the tool says so and does not charge.

It will not hide a scratch. That is not a slogan — it is a product decision. A hidden problem comes back as a return. I have built for this trade before, with Dealer ID; WatchEnhance is the photo half of the same desk.

The stack is React on the site and a Python engine on Cloud Run. Generation goes through fal.ai. Alignment, dial geometry and the verification gates are local code. Vibe coding is very good at getting a pipeline like that onto the page. It is useless at deciding which failure is unforgivable. That part is why a general photo tool with a “watch mode” is not this product.

What shipping two things in a row actually shows

The ceiling of vibe coding is not a type of software. It is a type of situation: can you specify it, and can you judge it?

Bubbi is a parenting utility whose acceptance test is a tired adult at 3 a.m. WatchEnhance is a B2B tool whose acceptance test is a dealer who will not forgive a rewritten dial. One is SwiftUI. One is Python and a verified image pipeline. Both shipped because I could tell when the generated code was wrong.

That is the whole thesis of why I vibe code. Speed is not the point. Attempts are. Halfdan Harring, one person in Aarhus, now has two more live products on the receipts page — and the next idea already has a shorter distance to a URL.

Where to go