Scroll Books has been live in the App Store and on Google Play for about a month. It's a reading app built around short passages from public domain books, meant to fit into the gaps in a day I’d normally be doomscrolling social media.
I’ve been building it since February, but the last few weeks were the first time it was a real product that strangers could download. This is a write up from the first few weeks.
Here's what I actually did, and what it taught me.
Shipping is mostly the part after "it works"
The app "worked" months ago. Getting it into the stores was a different job entirely. Apple won't approve an app that lets people create an account but not delete it, so I had to build in app account deletion before I could ship at all. I also needed privacy policy links in Settings, correct build numbers, and submit data safety forms for both Apple and Android. None of it was interesting but all of it was required; I'd quietly assumed it would take an afternoon. It did not!
Around the same time I spent a full day paying down dependency debt I'd been ignoring: eight or nine major version bumps in one sitting, plus a major Flutter upgrade and clearing out ~100 warnings. Deferring major upgrades feels free right up until the day you do them all at once. A lesson learnt.
Then I looked at the data, which was humbling
Once there were enough users to bother measuring anything, I sat down and did a proper review against Amplitude. It's a small sample, ~100 people over ~three weeks. The data was not flattering. Day 1 retention was ~8%, day 7 was ~2%, day 30 was near zero. ~10 people were genuinely coming back per week.
Three things stood out.
The biggest problem wasn't a missing feature. It was a bug: returning users were being forced to log in again, every single time - Gah! Auth screens accounted for ~40% of all screen views. People were spending nearly half their time in the app just trying to get back into it. I didn’t see myself, as I was always already logged in.
The second was a big signup cliff. ~75% of people finish onboarding but only 37% create an account.
The third was the one I didn't want to hear; Streaks have never worked. The longest streak any user has ever recorded was ~3 days, and the streaks tab was opened a handful of times in a month. I'd built streaks because every app has streaks, and I’d assumed people would find this loop helpful for reading, but the data was telling me I'd shipped a feature nobody wanted that also made the app feel like it was nagging them.
Acting on it
So I spent a week just doing what the data said would help.
I fixed the re-login bug and pushed it out as a priority release. I found a few other somewhat related bugs at the same time, so I fixed those as well at the same time.
I moved account creation to after the first reading session instead of before it, so people reach the actual reading before the app asks them for anything. Hopefully this will soften the signup cliff, I’ll monitor the data over the next month to validate.
Oh, and I killed streaks! I replaced them with something quieter, more focused on reading. Now each day's reading just lands as a small note, a quick read or a good read or a long read, measured in minutes, with nothing to ‘break’. You can set a gentle intention, or ignore it all together. It's the opposite of gamification, and it's a bet that the kind of person who'd actually stick with a reading app doesn't want to be nagged by one. I might be wrong about that, but I’ll track it over time.
The unglamorous floor
The app had been shipping with no crash reporting, so a crash in production produced exactly zero signal. I wired up Sentry. I added CI that runs all the tests on every pull request, which I should have had from the first week.
I replaced my hand driven release process, where I manually bumped the version, manually built, manually uploaded and hoped, with a single repeatable script that refuses to ship if the tests fail and walks me through the store checklist before it does; which has been very helpful.
What I think I learned
Mostly that I'd been optimistic about the wrong things. I was adding features while the thing keeping people out was a login bug, and the thing quietly pushing them away was a feature I was proud of.
The first month's numbers are small, so I’m not going to over read them, but they were specific enough to argue with, and arguing with them turned out to be more useful than any roadmap I'd written out of my own head!
Next month I get to find out whether any of it moved.
