Inspiration

Turkmenistan has almost no legal digital reading market — most books get pirated on Telegram, and Kindle/Apple Books don't operate there. We built Aýkitap to fix that with local bank/wallet payments. Shipaton pushed us to open it to the rest of the world with RevenueCat.

What it does

A full reading platform — EPUB/PDF/CBZ books, subscriptions, single-book purchases, streaks — across a Flutter app, NestJS backend, React admin panel, and Next.js website. Turkmen users pay by bank/wallet; everyone else now pays through RevenueCat via the App Store/Play Store, both landing on the same backend entitlement.

How we built it

Flutter + purchases_flutter for the app, NestJS/Postgres backend with a webhook + reconciliation layer for RevenueCat, Firebase for international login alongside the existing phone-OTP system, and a React/Mantine admin panel for mapping store products to books.

Challenges we ran into

Running two payment systems on one entitlement without conflicts, verifying store purchases server-side instead of trusting the client, and merging phone and Firebase logins into one identity without accidentally merging two different people.

What we learned

Building local-first, then generalizing, forces better infrastructure than building global-first — canonical account IDs and a purchase_mode capability instead of hardcoded payment UI.

Built With

+ 8 more
Share this project:

Updates

posted an update —

Shipaton build log — what landed in 16 days

Aýkitap is a digital library for a language that doesn't have one. Turkmen is spoken by millions and carried by essentially no commercial e-book platform — no Kindle store, no Play Books catalog, no Apple Books shelf.

Since Shipaton started on August 25: 467 files changed, 20,528 lines added, 9 releases. v1.1.2 is live on both Google Play and the App Store.

What shipped

Opened the app to the world. At launch the only way in was a +993 phone number and an SMS code, which locked out the entire diaspora. It now also accepts email, Google Sign-In and Sign in with Apple. Result: active readers in 7 countries — Turkmenistan, US, Iran, France, Australia, Canada, UK — with two thirds of them now outside Turkmenistan.

The full RevenueCat integration. Store subscriptions and consumable wallet top-ups on separate offerings, a custom four-language paywall driven by real Packages, and one service that merges the store entitlement with the existing local manat wallet — so a store subscriber and a wallet subscriber are indistinguishable to the reader.

The hard part: RevenueCat is unreachable from inside Turkmenistan (api.revenuecat.com → 127.0.0.1). With the identify call blocked, purchases land on anonymous $RCAnonymousID identities, the webhook arrives carrying one, and the backend correctly refuses to guess whose it is — so the reader pays and gets nothing. Fixed with an alias table: the app reports its App User ID to our own backend, the webhook resolver consults it, and previously unmatched events are reprocessed the moment the alias lands.

App Store compliance. iOS payments re-routed to App Store IAP behind a single toggle, closing guidelines 3.1.1 and 2.1(b).

Retention machinery. A server-verified reading streak that measures actual reading time, not app-open time, paying real rewards. Native iOS and Android home screen widgets. A OneSignal "continue reading" campaign whose payload carries no book data at all — the title is resolved on-device on tap.

Design. A turntable nav bar you can spin with your finger, a library laid out as an actual wooden bookshelf, six page-turn styles including a real page curl, and one shared motion system that respects reduce-motion.

Where it stands

  • 104 active users, 93 first opens, 20m 30s average engagement — above the E-Books peer median
  • 22.2% retention at week 3, 3.5 engaged sessions per user
  • 501 books opened, 871 in-app searches
  • 100% crash-free on both platforms, 5.00★
  • 49 push subscribers, first campaign delivered in 1.67s

Store billing only just opened, so the international rail is now beginning to convert. Next: more formats, and the first paid acquisition this app has ever been able to run.

Log in or sign up for Devpost to join the conversation.

Submission history