Overview
- Product
- In-house mahjong learning game
- Platforms
- Browser / LINE Mini App / iOS / Android test distribution
- Scope
- Concept, UI design, development, store review, subscriptions, advertising, operation, and improvement
- Launch
- Browser and LINE Mini App: July 2026 / iOS: August 2026
- Links
- Product page / Play in browser / App Store
Why we built it
Mahjong improvement depends on repeated tile-discard decisions, but a full game takes close to an hour. We isolated that decision and turned it into short drills: a few seconds per question and 60 seconds per session.
The priority was to make meaningful practice possible during a commute or short break.
Core features
Multiple training modes
One-suit hands, standard discard decisions, and hand-scoring practice, each built around a 60-second time attack.
Oni difficulty
A five-second limit per question and a score multiplier for consecutive correct answers.
Ranks & leaderboards
All-time, weekly, and mode-specific rankings encourage repeat practice.
Review & explanations
Players can revisit questions and check the correct tile or scoring breakdown.
One codebase, four entry points
The interface is built with TypeScript and Next.js and exported as static files. Cloudflare Workers serves the browser version. Capacitor wraps the same build for iOS and Android, while the LINE Mini App uses the same screens.
Supabase stores questions and rankings. RevenueCat handles subscriptions and the lifetime ad-removal purchase. Google AdMob provides advertising.
- TypeScript
- Next.js
- Capacitor
- Supabase
- Cloudflare Workers
- RevenueCat
- Google AdMob
- LINE Mini App
Problems we solved
Store products did not appear
Two issues overlapped: the App Store paid-app agreement was still waiting for tax and banking information, and a Capacitor plugin object was being returned through an asynchronous function in a way that made JavaScript treat it like a Promise. Activating the agreement and referencing the plugin synchronously resolved the problem.
Required subscription information disappeared
Renewal terms, cancellation guidance, and links to terms were originally shown only when pricing loaded successfully. We changed the screen so disclosures and a retry action remain visible even when the store response fails.
An ad appeared after the score
When interstitial loading was slow, the result flashed before the ad. We reordered the flow so the result renders only after the ad attempt completes.
Commercial hosting terms
The first browser host did not permit commercial use on its free plan. We moved the deployment before monetization and now verify commercial-use terms during planning.
What clients gain from this experience
Store review, payments, advertising, and hosting terms can create more launch risk than the feature code itself. Having solved these issues in our own product lets us account for them earlier and reduce rework in client projects.
