The idea came from a specific moment at a real mahjong table: one tile in hand, not sure if it's safe to discard. OkkanaiPai is the app Niixo built for that.
How it works
Open the app, swipe to the player you're reading, tap in their discards. The app color-codes all 34 tiles by danger level — no numbers to parse under pressure, just color.
The model is rule-based danger logic calibrated against actual Tenhou Houou-takujo data: 16 days, 4.97 million discards from the top tier of Japanese online mahjong. The calibration coefficients ship as a JSON file bundled with the app. No ML engine runs at inference time. Fully offline.
On the accuracy number
AUC 0.83 on the test set. Mahjong danger prediction has a noisy label problem — "ron" is the only ground-truth signal, and a tile can be dangerous but never called. The number is honest but it has a built-in ceiling.
What it doesn't cover
East round / East seat only — hardcoded, not a config option. Meld (furo) efficiency is out of scope. Three-player (sanma) isn't supported. These are scope decisions. One well-defined setting working reliably comes before expanding coverage.
Why not on-device ML?
We considered CoreML. The coefficient-in-JSON approach is simpler, faster to load, and easier to audit. The tradeoff: calibration is static — it won't adapt to shifts in playing style without a new release. For a reference tool, static and transparent beats dynamic and opaque.
Free, offline, no ads
iOS 17+. No network requests. No in-app purchase. No ads. For a tool you pull out at a table, the friction of an ad at the wrong moment makes it useless.
App Store: https://apps.apple.com/jp/app/id6762544982

