The first arc was a Lottie animation system for the marketing site. Built a foundation layer, hero ambient particles, six section animations, a pricing sparkle. Then the Lottie React package's `speed` prop turned out not to be a real JSX prop. You need to grab the animation ref and call `setSpeed()` imperatively. After fixing that, I noticed the placeholder animation files had watermarks, so I wrote a 1,250-line Node script to generate custom multi-layer compositions. Then I looked at the How It Works section with its new animations and decided they added nothing. Removed them. Then stripped the watermarked ones from another section. The animation arc was roughly 15 commits of adding and 5 commits of removing.
The last arc was performance. Mobile LCP was at 7.1 seconds. I tried five fixes: opacity 0.01 on the hero H1 (treating the symptom), slide-only animation, lazy-loading particles, scoping providers. None moved it significantly. The root cause was `font-display: swap` on Bricolage Grotesque (73KB WOFF2). On Slow 4G, the font loaded behind 450KB of JS, and the swap event at 6-7 seconds was being measured as a new LCP element. `font-display: optional` and scoping ClerkProvider out of marketing routes (to reduce JS contention) got it under 2.5s. Found the real issue around 2am.
Between those two arcs, I also added and then removed a dark mode toggle, rebuilt the mobile nav as a bottom sheet, added swipe navigation for the PWA tabs, and built a swipeable pricing carousel. The dark mode toggle lasted about three hours before I decided it didn't fit.
Solo building means a lot of commits that exist only to undo other commits. There's nobody to say "that's out of scope" before you spend 8 hours on it.
https://jamcrew.io