Building Cozy Reader
My wife reads a lot. Hundreds of books this year alone, across paper, ebooks, and audiobooks. She’s used various apps and trackers for years, and I wanted to make her something that felt like hers instead.
Cozy Reader is that app. It tracks what she’s reading, what she’s finished, and what she wants to read next. It has yearly goals and stats, a reading timer, and three pixel-art cats that walk across the top of the screen. I started it late one night with Claude, and about two and a half hours later the first build was on TestFlight and running on my phone.
Her volume changed the plan
Like with Gamelog, I didn’t start with code. I described her reading habits and asked what quality-of-life features a tracker should have. Claude’s first point reframed the whole project: at hundreds of books a year, logging a book has to take seconds. If it takes longer, she’ll stop using it.
That one rule decided most of what came next:
- Search fills everything in. She types a title, author, or ISBN, and the cover, author, and page count come from Open Library. She never types book details by hand.
- A swipe changes status. Swipe a book to start or finish it, and the date fills in by itself.
- Goodreads import is in the first version. Without it, she’d have to re-enter years of history, and she wouldn’t.
- Format is a real field. Physical, ebook, and audio each count, and the stats split by format.
Claude also said what to skip: accounts, a server, and social features. Her books live on her phone, with iCloud sync planned. I liked that answer because it’s less to build and less to break.
Three sessions at once
This project felt different from Gamelog because I ran several Claude sessions at the same time. One built the app. Another designed a color palette, with a warm light theme called Morning Tea and a dark one called Lamplight. A third drew the cats. When the palette was done, I told the app session where to find it, and it applied the colors screen by screen.
Later, while one session built the reading timer, I asked another to plan barcode scanning without touching any code, because the app was mid-change. It wrote up a plan I can hand to the next session. Keeping each session on one job, and telling each one what the others were doing, kept them from stepping on each other.
Fern, Finn, and Frank
The cats are based on our three cats. I described each one to Claude, and it drew them as tiny sprites with the right markings: Fern’s lopsided face mask, Frank’s big ears and white paws, and Finn’s bold stripes. They breathe, blink, flick their tails, walk, sleep, and groom each other.
Not every pose worked on the first try. The first “roll” animation was just the cats sitting still, which I pointed out with a “lol.” The first version also sat in a shelf that pushed the book list too far down the screen. Now the cats are smaller and walk along the top bar, between the Sort and + buttons, on every tab. There’s a switch in Settings to turn them off, though I doubt anyone will.
Reading mode
The biggest feature I added that night was reading mode. I wanted a home screen widget she could tap to start a reading timer and turn on Do Not Disturb.
Claude checked Apple’s documentation first and found that iOS doesn’t let apps turn on Do Not Disturb or any Focus. It offered the next best thing, which works the other way around. She adds Cozy Reader to her Reading Focus once. After that, turning on the Focus starts the timer, and turning it off stops it.
The timer shows up everywhere: a Reading tab in the app, the home screen widget, the Lock Screen, the Dynamic Island, and Siri. I asked for a pause button, too. Paused time doesn’t count, and if she forgets a paused timer overnight, it adds nothing to her total.
Don’t lose her books
Her reading history is the one thing this app can’t get wrong, so I asked for it to be treated as irreplaceable. A few moments showed why that mattered.
Early on, the tests reported success but had actually run zero tests, because the test file wasn’t part of the project. Claude noticed the count, fixed it, and now checks how many tests actually ran every time. A green result isn’t the same as a working result. That’s true in support, too.
I asked that a new year never wipe out the last one. The finished books were already safe, but the reading goal was a single number, so changing it next year would have rewritten this year’s goal. Now each year keeps its own.
The widget raised the sneakiest problem. It needs a storage area it shares with the app, and adding that area made the database quietly copy her library into it. Nothing was lost, but her library would have depended on a setting that changes later. Claude caught it by installing the old version with sample books, then installing the new version over it and checking that all 30 books were still there. The library now stays where it started.
What’s next
The app was called Book Tracker for most of that night. I renamed it Cozy Reader, which suits it better. It now has an app icon, a private GitHub repo, and its first TestFlight build.
Next, I’ll add my wife as a tester. The real test of the Goodreads import is her actual export file, and I’d rather find problems with her history on a test build than after she depends on the app. After that come barcode scanning, iCloud sync, and more widgets.
Update, October 3, 2026: My wife is now testing Cozy Reader on TestFlight. Since that first night, it has gained iCloud sync between her iPhone and iPad, backup and restore, custom lists, more themes, and a reading timer that records time for each book. Anyone can try it: email zachvivierdev@gmail.com. The Cozy Reader page has the details.
Gamelog was something I built for myself. Cozy Reader is for someone else, and that changed how I tested it. I kept asking whether she would notice, and whether she would lose anything.