Inspiration
Most reading trackers treat a book as a checkbox: read, or not read. But a book is a span of time - the three weeks it took, the year you were nineteen, the winter you read it again and thought something completely different. Check a box and all of that is gone; worse, reread the book and most apps overwrite what you thought the first time.
We wanted a log that keeps the time inside the record - and keeps it private. No feed, no ranking, nobody watching you read.
What it does
Bibliophilia is a personal reading log built around dates and rereads.
- Four states, two dates. Unread, Reading, Finished, To Read. Starting a book records the date; finishing asks for the date, a rating and what you thought - so every book keeps how long it actually took.
- Rereads add up instead of overwriting. A second reading becomes a second entry with its own dates, rating and notes. Each pass can be edited or deleted on its own.
- Three ways to add a book. Type a title, search by ISBN with bibliographic data filled in automatically, or point the camera at the barcode on the back cover (Premium). Covers resolve automatically from the ISBN, with a title-based cover standing in when none exists.
- Goals that move with you. Monthly or yearly targets computed from finished books - change the count or the period and the goal follows.
- Badges per cycle. Six badges, and the same badge takes a different form on your second reading cycle.
- Author follow with new-release notifications (Premium). Follow authors and get notified when public bibliographic databases list something new.
- Quiet by design. No feed, no leaderboard, no friend list, no account. Records live on the device, and titles, authors, ISBNs and note text are never sent for usage statistics.
The free plan covers 5 books with every feature; Premium unlocks unlimited books, camera scanning, the analysis tab, CSV export and unlimited author follows.
How we built it
Swift and SwiftUI, iOS 18 and up, with reading records persisted on the device - there is no server-side user data at all.
- AVFoundation for the ISBN barcode scanner
- openBD for bibliographic data, with cover art resolved through a fallback chain across public book databases (an async resolver that normalizes ISBNs, converts ISBN-13 to ISBN-10 where needed, and verifies actual image bytes before accepting a result)
- Cloudflare Workers as a thin relay for new-release checks - only followed author names are sent, nothing else
- RevenueCat with StoreKit 2 for the subscription: two products, one group, one entitlement
- PostHog for product analytics, with book titles, authors and notes explicitly excluded from every event
Challenges we ran into
Cover images that exist everywhere except where you look. Our first cover source returned empty for most Japanese books; the big Western database simply does not carry them; a national library source demanded request headers that SwiftUI's image loading does not send. What survived was a fallback chain that tries each source in order of real-world coverage and checks the returned bytes - because several sources answer "success" with a blank placeholder image.
A paywall that appeared out of nowhere. A user report said the paywall showed up on a free feature. We could not reproduce it - until analytics showed the paywall's trigger source was a different button than the report described, and the device log showed a SwiftUI fault: two views were binding the same published flag to two different sheets, and under the right timing the wrong one presented. The fix was structural - guaranteeing only one presenter at a time - and the lesson was that the report, the analytics and the device log each held a third of the truth.
Accomplishments that we're proud of
The reread model. It sounds small, but "a second reading is a second record" required rethinking the data model, the editing flows and the badges - and it is the feature that makes the app feel like a bookshelf with memory rather than a checklist. We are also proud of shipping a genuinely quiet app: no account, no social layer, and analytics that structurally cannot see what anyone is reading.
What we learned
Verify the runtime, not the intention. The double-sheet bug was invisible in code review - both bindings were individually correct - and only the device's own log told the truth. And data quality is a feature: users experience a missing cover as a broken app, so the unglamorous fallback chain mattered more than several visible features.
What's next for Bibliophilia
Making the two ways of adding a book harder to confuse - clearer separation between typing an ISBN and scanning one with the camera - and continuing to grow the author-follow catalog so new-release notifications cover more of what our readers follow.
Built With
- avfoundation
- barcode
- cloudflare-workers
- ios
- isbn
- openbd
- posthog
- revenuecat
- storekit
- swift
- swiftui
Log in or sign up for Devpost to join the conversation.