Inspiration

Most "memory" apps are journals: endless, dated, private, and quietly guilt-inducing when a week goes by. Kinlore is the opposite object — a finite book, written for one named person, that ends. Twenty-eight prompts, twenty-eight pages, bound. The prompts are small and concrete ("The first home you remember", "A game you played without any toys", "A dish from your childhood kitchen you can still taste") because a grandparent, a parent or a partner will answer a street or a sound long before they will answer "tell me about your life."

What it does

You choose who the book is for. Each prompt is one page: write a few sentences the way you would tell them, tap Bind this page, and the page is set in type and added to the book. Volume 1 — Origins, four chapters (Beginnings, Home, People, Roads) — is free in full. The cover grows with the pages: paper, cloth, leather, gilt, ribbon, and an ornament for every finished chapter; the next step is always shown as the real number of pages, never as a countdown. Free pages without a prompt, as many as you like. Export the whole book as a PDF or plain text at any time, share one page as text. A daily reminder that is simply the next prompt, off until you turn it on, with quiet hours. Nineteen languages including right-to-left Arabic. No account, no server, no analytics, no advertising: the book lives only on the phone. No dates, no daily runs, no timers — a quiet week changes nothing and nothing is ever taken away.

Kinlore Premium — one purchase: Volumes 2 and 3 (fifty-six more prompts: Everyday Things, Turning Points), a book for each person you write for, three more typesetting themes, and a print-layout PDF with a cover, a table of contents and page numbers. Bought once; Volume 1, free pages and export stay free.

How we built it

Expo SDK ~54.0.37, React Native 0.81.5, TypeScript, Expo Router ~6, Zustand 5 for state, react-native-mmkv 4 for local storage, expo-print + expo-sharing for the typeset PDF (an HTML/CSS print layout with @page A5 sheets, running heads and a page counter — the same engine renders the in-app pages and the printed book), expo-notifications for the single opt-in reminder. Monetization runs on RevenueCat (react-native-purchases ^10.0.1): entitlement premium, offering kinlore_default, one package $rc_lifetime mapped to the Play product kinlore_book (non-consumable). The package mapper is deliberately strict: an offering whose packages do not match returns null and the paywall reports it instead of guessing a first package. Vitest covers the mapping, the cover-tier monotonicity, the prompt volumes and the export layout. Android builds run in GitHub Actions with our own upload keystore; nothing is built locally.

Challenges

Bind is a one-way door — a bound page is typeset and joined to the book, so the whole editor had to be honest about that moment without nagging: the button is only enabled when there is text, Bind never asks "are you sure?", and undo is the free page. The cover tiers had to reward without ever punishing: tiers only rise, nothing withers, and the preview of the next tier is a real page count read from the same store that counts bound pages (a test proves the shelf persists nothing of its own). The print layout took the longest: a CSS paged-media document that produces a cover sheet, a table of contents with chapter → page ranges and a running head on every sheet, verified in tests against the HTML rather than by eye. On the release side, the first bundle was compiled with an empty RevenueCat key because the CI variable had never been created for this app — the paywall would have rendered its calm "not available" branch and nothing would have crashed; the rebuild with the key and a higher versionCode is the one on Play.

Accomplishments

A monetization design with no dark pattern and a single price: no subscription, no streak, no timer, no "last chance", and the free volume is the complete first book rather than a teaser. Nineteen languages where the app name itself is localized ("Hatıra Kitabı", "Livre de souvenirs"…) and RTL is real, not mirrored by accident. A print-ready PDF that a family can actually have bound. Three audit rounds ending in AUDIT_PASS with zero findings, and the store frames and demo video recorded from the signed CI build, not a dev client.

What we learned

"Finite" is a feature that has to be defended in every screen: the moment a counter, a date or a daily expectation slipped in, the object stopped being a book and became a habit tracker. And a component that is configured is not a component that runs — the RevenueCat SDK, offering and product were all correctly wired in code while the binary carried an empty key; only reading the CI variable list caught it.

What's next

The production release (RevenueCat-keyed build) was submitted to Google Play review on 20 September 2026; kinlore_book is live on Play and mapped in RevenueCat. The App Store submission reuses the same 19-language listing, PDF engine and assets.

Built With

  • expo-notifications
  • expo-print
  • expo-router
  • expo-sharing
  • expo.io
  • github-actions
  • react-native
  • react-native-mmkv
  • react-native-purchases
  • revenuecat
  • typescript
  • vitest
  • zustand
Share this project:

Updates

Submission history