funnel
A funnel with every screen logged, and no idea where users left
Screen tracking was firing, yet the funnel question stayed unanswerable. The data landed where I could not query it, and one step I added would read 100% forever.
Search posts
kiniinsight
Notes from building mobile apps - the parts that broke, what the fix actually was, and the tools behind it. Written from what I ran, not from memory.
Read the latestfunnel
Screen tracking was firing, yet the funnel question stayed unanswerable. The data landed where I could not query it, and one step I added would read 100% forever.
A self-management app that only adds up. No streaks, no comparison.
Google Playgit
When line endings flip from LF to CRLF, git treats every line as modified. Measured numbers for the diff, the blame damage, and why -w beats --ignore-rev.
subscriptions
Every step of attaching subscriptions to an Android app, in order, with the specific places it silently breaks and how to tell which layer failed.
in-app subscriptions
Wiring in-app subscriptions blocked three releases in one day. Every blocker was a name or a scope that had to match across two systems, and none of them errored.
LLM
Caching an LLM call looked trivial until I checked why it was safe. The reason I reached for first was wrong, and partial hits corrupted the totals.
design tokens
An app with design tokens still had 953 hardcoded colors, and 349 of them were values the tokens already defined. Automating the swap went wrong twice.
uniq
On macOS, uniq reports duplicates that do not exist in non-Latin text. It collapsed 397 distinct lines into one. The cause is collation, and uniq never signals it.
morning routine
I measured 40 morning routine autocomplete suggestions. Eight ask about side effects and failure, and the real question underneath is whether sleeping less is fine.
Android
I shipped the same broken Android widget four times. The preview looked right and the build passed, but adding it to the home screen failed every time.
habits
I measured 36 autocomplete suggestions for a Korean phrase about broken habits. Three ask how to fix it. Five assume it already happened again.
search intent
I picked five topics by search volume and dropped four an hour later. Reading the ranking pages showed the search intent behind those words was different.
typescript
I judged TypeScript by grepping tsc output for a string it never prints. It stayed silent every time, and I read silence as success. Six real errors were hiding.
study planner
The phrase study planner returns a consultant, a paper notebook, and an app in one page of results. Decide which you want, or you buy whichever had the best ad.
firestore index
I deployed a Firestore index, relaunched, and got the identical failed-precondition error. The deploy was fine. A building index reports exactly like a missing one.
entry point
I disabled a bottom sheet that opened automatically because it annoyed me. That automatic open was its only entry point. I did the same thing twice in two days.
voice input
Typing todos into my own app annoyed me, so I built voice input for one spoken sentence. No model, just regex, and a split rule that nearly cut verbs in half.
react-native
A 3D planet stopped animating on iPhone only. The GL context was alive, three.js rendered every frame, and endFrameEXP fired 60 times a second. Nothing reached the screen. The cause was React Native's view flattening.
CLAUDE.md
Instruction files fail open. Auditing CLAUDE.md turned up two rules living only on this laptop, plus two referenced files that never existed.
GLB file size
Two sky models arrived at 8MB for a phone app. Almost all of that GLB file size was 2048px textures my renderer discards before the first frame.
habit streaks
Habit streaks get heavier the longer they run: one missed day costs 3 early on and 100 later. Here is what I shipped instead, with numbers.
react native modal
The onboarding button did nothing and the app looked frozen. A React Native Modal is a separate window, so it swallows touches from everything below.
scheduled notifications
After a sign-out, the previous user's tasks kept firing on my lock screen. Scheduled notifications live in a per-device OS queue that auth state never touches.
turborepo
Turborepo reported FULL TURBO in 62ms and wrote zero build artifacts. The cause was one line in outputs, sitting behind a root task that had not run for 71 days.