Show original
Enjoyed this article?
Use "Request tipping" to ask the author to set up tip receiving.
AI translation
Rather than adding features to keep things going, we decided on the limits first. This is a design memo for the eye training app FocusGym.
Enjoyed this article?
Use "Request tipping" to ask the author to set up tip receiving.
On both smartphones and PCs, our eyes stay focused on "near" distances all day long. To give them a break, I included 5 types of training: near-far focus switching, pursuit movement, convergence training, Gabor patches, and blur-clarity exercises. Each one takes only tens of seconds to complete.
When building habit-forming apps, the usual approach is to add features in the direction of "get users to use it more." But with eye training, doing too much just tires out your eyes. Making users spend more time doesn't benefit them.
So I built in a DailyLimitService mechanism that caps the total daily training time at 5 minutes (300 seconds). When you exceed 4 minutes, a "1 minute remaining" warning appears, and once you've used up 5 minutes, you can't start training for the rest of that day. It resets when the date changes.
Once you decide there's only 5 minutes, other things automatically fall into place. Each training session can't be long, and the home screen needs to constantly show "how many minutes you have left today." Ads work the same way—I made interstitials appear "only once, after the first training session of the day." There's no room for multiple ads within a 5-minute experience.
With such short sessions, the sense of accomplishment tends to disappear. I fill that gap with a streak counter (consecutive days) and a monthly calendar. Seeing "I did it today" becomes the only reward for maintaining a short habit. I've also included daily reminder notifications.
Implemented with Flutter + Hive + go_router. Training history is saved only locally on the device in Hive and not sent to any server. What tripped me up was animation—when passing a Cubic to AnimationController.animateTo(), if CurvedAnimation also applies a curve, it gets applied twice. Support is iOS 16.0 and later.
All features are free to use (with ads). There's an optional 300 yen one-time purchase to remove ads. Note that this app is not a medical treatment and does not guarantee vision improvement or cure presbyopia. If you experience any eye abnormalities, please consult a medical professional. The research that informed each training method is listed on the support site.
App Store: https://apps.apple.com/jp/app/focus-gym/id6760606419
スマホもPCも、目は一日中「近く」にピントを合わせっぱなしです。そこを休ませるために、遠近ピント切替・追従運動・寄り目トレーニング・ガボールパッチ・ぼかしくっきり訓練の5種類を入れました。どれも1回数十秒で終わります。
習慣化アプリを作るとき、普通は「もっと使ってもらう」方向に機能を足します。でも目のトレーニングは、やりすぎれば目が疲れるだけです。長く使わせることがユーザーの得にならない。
そこで DailyLimitService という仕組みを入れて、1日の合計トレーニング時間を5分(300秒)で打ち切ることにしました。4分を超えると「残り1分」の警告が出て、5分を使い切ると、その日はトレーニングを開始できません。日付が変わればリセットされます。
5分しかないと決めると、別のところが自動的に決まります。1回のトレーニングは長くできないし、ホームでは「今日あと何分できるか」を常に見せる必要があります。広告も同じで、インタースティシャルは「1日の初回トレーニング完了後に1回だけ」にしました。5分の体験の中で何度も広告を出す余地はありません。
短い分、手ごたえはゼロになりがちです。そこを連続達成日数(ストリーク)と月間カレンダーで埋めています。「今日もやった」が見えることが、短い習慣を続ける唯一の報酬になります。毎日のリマインダー通知も入れています。
Flutter + Hive + go_router で実装しています。トレーニング履歴は端末内の Hive にのみ保存し、サーバーには送っていません。ハマったのはアニメーションで、AnimationController.animateTo() に Cubic を渡したときに CurvedAnimation 側でもカーブをかけると二重適用になる、という点です。対応は iOS 16.0 以上です。
全機能を無料で使えます(広告付き)。広告を消したい場合のみ300円の買い切りがあります。なお、本アプリは医療行為ではなく、視力の改善や老眼の治癒を保証するものではありません。目に異常を感じた場合は医療機関を受診してください。各トレーニングの参考にした研究はサポートサイトに載せています。
App Store: https://apps.apple.com/jp/app/focus-gym/id6760606419