We will be undergoing planned maintenance on Oct 7th 6:00AM UTC / Oct 7th 2:00AM ET

Inspiration

When I was in elementary school, a small library opened in my village, the first one it had ever had, and every student had to become a member. On our first visit, I saw shelves filled with books other than school textbooks for the first time, and learned about storybooks called novels. I also got my very first library card: a simple piece of cardboard, cut by hand by the librarian, with my name and member number written on it. It made me so happy.

After that, my friends and I went to the library every afternoon after school. At first we didn't go to read; we went to hang out because we knew the librarian. In a small village, everyone knows everyone. Slowly, I started reading whatever I could find. Then I picked up one of my first novels, Girl of Kosovo by Alice Mead, and felt pulled right into the story. That was the start of a lifelong love of books.

I often find myself missing those simple afternoons. I built Litmark to bring that feeling back, so that just looking at the app brings back a small wave of that nostalgia.

What it does

Litmark is a nostalgic reading tracker built around a digital version of a cardboard library card. You log the books you read, and they appear on a card that's simply yours.

  • Your Library Card: your reading life lives on a digital library card inspired by that hand-cut original, and every other feature builds on it.
  • Reading Streak: every day you read fills in your streak, with a shareable weekly or monthly summary card so it doesn't just live in the app.
  • Reading Statistics: each month, Litmark tallies the books you finished, the pages you read, and your average pace, gathered right on your library card.
  • Reading Stamps: milestones along your reading journey, like streaks, pages read, reading time and the size of your collection, earn stamps, collected in a stamp album and shareable as their own paper-style cards.
  • Bookshelf and Collections: browse your library as a decorated shelf, a grid, or a list, filtered by reading status or genre, and group books into your own collections or ones Litmark generates for you by author or genre. Add a book by scanning its ISBN barcode, and Litmark looks it up and flags it first if it's already on your shelf.
  • Import from Goodreads and StoryGraph: bring your existing library over from an export, or back your own up and restore it from a file.
  • Reading Sessions and Quotes: track page progress in real time, re-read a book and it counts every pass, share what you're currently reading, read by a warm adjustable reading light at night, and save a line the moment it stops you as a styled, shareable quote card.
  • Home Screen Widgets: your currently-reading book, your streak, and a shuffled quote, right on the home screen on both iOS and Android.
  • Local-First, No Account: like a paper card in your pocket, your data stays on the device. No sign-up, and the core of the app works fully offline.
  • Pro Features: extra appearances and sound effects, deeper streak history, and no limit on shelf decorations or collections, offered as a monthly or yearly subscription, or a one-time lifetime purchase.

How we built it

Litmark is built with Flutter, one codebase for both iOS and Android, using Riverpod for state and go_router for navigation. All reading data (books, sessions, quotes, streaks, stamps, and shelf arrangement) lives locally in a drift (SQLite) database, so the core app works fully offline with no account. Firebase handles the operational side: Crashlytics, Analytics, Performance Monitoring, Remote Config, and App Check.

RevenueCat gates Litmark Pro behind a single entitlement that three different products can satisfy: a monthly subscription, a yearly subscription, or a one-time lifetime purchase, presented through RevenueCat's hosted paywall and Customer Center, so pricing and copy can change without an app update. Which RevenueCat offering the paywall shows is itself a Firebase Remote Config flag rather than something hardcoded, so switching a reader from the launch-price offering to the steady-state one, or running a pricing experiment, is a flag flip tied to whatever event should trigger it, not a store release.

Launch pricing was a one-time early-bird lifetime purchase at $4.99. The standard offering that follows it is $2.99 monthly, $19.99 yearly, or $69.99 lifetime in the US, with prices set by purchasing power in four tiers, from full price down to about 65% off, and Indonesia set by hand, so Litmark stays affordable in lower-income markets.

The home screen widgets are native (SwiftUI/WidgetKit on iOS, Glance on Android) and read the same local database the Flutter app writes to.

Challenges we ran into

  • Book metadata isn't evenly documented across countries, and even the paid catalog services don't close that gap. Manual entry had to be a real path, not just a fallback for the rare miss.
  • Without a server, keeping the library consistent was entirely on the device: imports from Goodreads and StoryGraph, re-reads, and duplicate detection all had to be reconciled locally.
  • WidgetKit and Glance don't share behavior just because they share a purpose, so the home screen widgets needed two separate builds. A Live Activity for reading sessions is still in progress on both, for that same reason.

Accomplishments that we're proud of

  • Turning organic reach into real purchases: in the last 28 days, 20+ readers bought the early-bird lifetime option out of 550+ active users, without a cent spent on ads.
  • Keeping the core reading log local-first and account-free on purpose, even though that meant solving data integrity myself instead of taking the easier route of standing up an API.

What we learned

  • Working with RevenueCat's hosted paywall and Customer Center meant most of the pricing and plan-switching logic never had to be written as app code at all. The real lesson was learning where the SDK's boundary sits, so I didn't duplicate what it already handles.
  • drift's compile-time-checked SQL made the local-first data model much easier to evolve over many releases than a plain key-value store would have.
  • Designing for a feeling, not just for features, changes every decision, from colors to wording.

What's next for Litmark

  • A real-time reading room, so readers can see what everyone else currently has open.
  • An auto-generated journey timeline: a vertical map of a reader's book history, styled like an old, hand-drawn vintage map.
  • Sync across devices, once there's a real account behind it.
  • A collaboration with real artists to redesign the stamps, the journey map, the shelf decorations, and everything else still drawn in-house.
  • Live Activity integration for an active reading session.
  • Partnering with major and indie publishers to grow Litmark from a reading tracker into an actual bookstore, the kind Kindle and Kobo are today, but built around reading analytics that serve the reader first, not just the sale.

Built With

Share this project:

Updates

Submission history