Inspiration
Living in Japan without fluent Japanese means a constant stream of dense paperwork: city-hall notices, health insurance, tax bills, utility invoices, landlord letters, school forms, bank documents. The problem is not reading every word — Google Translate already does that. The problem is understanding what the document means in context, what action it demands, the deadline, the amount, and how not to mess it up.
Yuika was built for that gap: point the camera at any Japanese document, and get a clear answer — what it is, what to do, by when, and how much — then keep it in a tracker so deadlines do not get lost in a drawer.
It is not a translator. It is an action layer on top of Japanese administrative reality.
What it does
- Scan — photograph a letter, bill, form, notice, or other Japanese paperwork.
- Understand — AI vision classifies the document, summarises it in plain English, extracts deadlines and amounts, and lists concrete next steps.
- Track — each scan lands in a personal tracker (status, recurrence, due-soon / overdue).
- Learn the system — short “living in Japan” guides (residence, My Number, insurance, pensions, etc.) sit beside the scanner so the app is useful between envelopes too.
Free tier: 10 scans per calendar month (Asia/Tokyo).
Yuika Premium: unlimited scans via monthly or yearly subscription (yearly includes a 7-day free trial where configured), powered by RevenueCat.
How we built it
Mobile
- Flutter (iOS + Android) — camera-first UX for standing over a piece of paper.
- Design system inspired by Japanese paper culture (washi / sumi / indigo, hanko stamps for done/confirmed).
- Auth with magic link (plus password login for store review); paywall and profile entry for Yuika Premium.
- Scanning overlay with a branded “reading” animation while the server processes the document.
Backend
- Go API + SQLite (pure-Go
modernc.org/sqlite, no CGO), self-hosted on OVH. - Document storage, deadlines, recurrence, and insights in one service.
- Vision pipeline behind a provider interface so the model can change without rewriting the product.
- Continuous backup with Litestream → OVH Object Storage.
AI
- xAI Grok (vision + structured JSON) for scan → type, summary, actions, deadline, amount, glossary terms.
- Separate grounded text path for keeping Japan-life guides current from official sources.
Monetization (RevenueCat + Shipaton)
Subscriptions are powered by the RevenueCat Flutter SDK (purchases_flutter):
| Piece | Choice |
|---|---|
| Entitlement | premium |
| Offering | default (current) |
| Packages | $rc_monthly, $rc_annual |
| App User ID | Yuika users.id via Purchases.logIn after sign-in |
| Server truth | webhook → premium_until on our backend |
Store products exist on App Store Connect and Google Play; RevenueCat unifies offerings, entitlements, and cross-platform restore. Free-tier scan limits stay on our server; unlimited scans unlock when the entitlement is active.
Shipping
- Brand-new store app in the Shipaton window (Play live early August 2026; iOS in the same program).
- CI via Codemagic on
v*tags; backend deploy via systemd + Caddy on our VPS.
Challenges we ran into
1. “Translate” vs “explain”
Raw OCR/translation is easy and wrong for the job. The hard product work was the prompt + schema: force document type, action list, deadline, amount, not a wall of bilingual text. Users need a decision, not a dictionary.
2. Japanese admin is noisy
Keigo, stamps, multi-column layouts, partial photos, handwritten notes, “please ignore this flyer.” Classification and confidence matter; we also ship a clear disclaimer: guidance only, always verify amounts and dates against the original.
3. Privacy is not optional
These are tax, bank, health, and My Number–adjacent documents. Account-scoped storage, delete document / delete account, and a privacy-first story were product requirements from day one, not a store checklist.
4. Real IAP is a multi-console problem
Shipaton forced the “real money path”: App Store subscription group + Play base plans + RevenueCat project (apps, products, offering, webhook) + Flutter paywall + server unlock. Sandbox, product ids vs packages, and keeping client entitlement and server premium_until in sync were the sharp edges. RevenueCat was the piece that made cross-store subscriptions shippable instead of two separate IAP stacks.
5. Backend honesty under load
We simplified the data layer (plain SQLite + Litestream instead of a custom distributed SQLite bundle) after production inserts failed with disk I/O errors during scans. Freemium scan quotas live on the server (Tokyo calendar month) so clients cannot bypass them.
What we learned
- Vertical AI products win on action + memory, not on OCR quality alone.
- Freemium for document AI needs a server-enforced free cap; Premium is the honest unlock for unlimited scanning cost.
- RevenueCat is the right abstraction for Shipaton-style shipping: one entitlement, one offering, packages on both stores, webhook as the source of truth for backend features.
- Expats do not want another generic “chat with your photo” app — they want what do I do by Friday.
Built with
Flutter · Dart · Go · SQLite · Litestream · xAI Grok · RevenueCat · App Store / Google Play subscriptions · Codemagic · Caddy / systemd on OVH
Links
- Web: https://yuika.app
- Privacy: https://yuika.app/privacy
- Demo: https://www.youtube.com/watch?v=VmeP_SoDOF0
Log in or sign up for Devpost to join the conversation.