やることを「クエスト」に見立て、完了すると経験値が入りドット絵の冒険者が成長していくRPG風ToDoアプリ。 企画・設計から実装・収益化・App Store公開まで、23日間で一人で完遂しました(2026年8月7日リリース)。
2026-07-16 開発開始 → 2026-08-02 審査提出 → 2026-08-07 App Storeで公開
「タスク管理が続かないのは、消しても何も起きないから」— 完了のたびに成長が見える体験を設計
繰り返し4種(毎日/曜日指定/隔週/N日ごと)、期限+時刻、優先度、ジャンル、入れ子フォルダ、横断検索、8種の並び替え、ドラッグ&ドロップ、完了の取り消し、ゴミ箱(30日自動パージ)
難易度別EXP・レベル曲線・連続達成ストリーク・ステータス割り振り・スキル52種(1日1回発動でEXPブーストの実効果つき)・行動で解放される実績称号16種。魔法・とくぎは9系統のエフェクトに紐づく
髪/服/アクセサリ/武器/盾など81パーツ(+「装備しない」3項目)をレベルで解放して着せ替え。完了演出では9系統の発動エフェクトがアニメーション。ドット絵108枚はすべて自作スクリプトで生成
プレミアム(広告非表示+統計解放)を月額/年額/買い切りの3プランで提供。無料ユーザーにはバナー広告と、視聴で30分EXP2倍になるリワード広告「ブーストタイム」
ローカル通知3種(デイリー/期限/ストリーク防衛)、初回オンボーディング、レビュー促進の2経路(レベルアップ直後だけの自動プロンプト+設定からいつでも書ける「アプリをレビューする」導線)、レベルアップのX共有カード、統計「きろく」21項目+グラフ3種
アカウント登録なし・データは全て端末内。JSONバックアップのエクスポート/インポート(検証付き)に対応し、課金状態は改ざん耐性のためバックアップから除外
主要ライブラリと採用理由
| 言語 / FW | TypeScript 5.9(strict・any禁止) / React Native 0.81 / Expo SDK 54 |
|---|---|
| UI | React Navigation(bottom-tabs) / Reanimated 4(演出・D&D) / expo-blur / 自作デザイントークンシステム(色hex直書き禁止・アクセント1色) |
| データ層 | expo-sqlite(WALモード・外部キー有効) / 追記型マイグレーション(PRAGMA user_version連動) / JSONバックアップ(スキーマバージョン付き・検証あり) |
| 課金 | RevenueCat(react-native-purchases)— エンタイトルメント1本で3プランを抽象化、オフライン用キャッシュは猶予7日 |
| 広告 | Google AdMob(react-native-google-mobile-ads)— バナー+リワード、ATT対応、SKAdNetwork 50項目、__DEV__でテストIDに強制切替 |
| 分析 | PostHog — 端末生成の匿名UUIDのみ・11イベントを型定義で管理・PIIなし |
| 通知 | expo-notifications — ローカル通知のみ(サーバーレス方針を貫くためAPNs不使用。自作config pluginでpush entitlementを除去) |
| i18n | i18next / react-i18next — 表示文字列のハードコード禁止、ja/en 約700キー |
| テスト | Jest + ts-jest — DB層はNode組み込みSQLiteに差し替えて実SQLでテスト(モックではなく実挙動を検証) |
| ビルド/配信 | EAS Build / EAS Submit(証明書・APIキー管理を非対話化) / TestFlight / GitHub |
| 開発支援 | Claude Code(AIエージェント)/pngjs(ドット絵・アイコン・スクショ加工の自動生成スクリプト群) |
「なぜそうしたか」を説明できることを重視しています
個人開発の持続可能性を最優先し、バックエンドを持たない構成に。データの真実は端末内SQLite、課金状態のみRevenueCatを真実とし、オフライン時は7日猶予付きローカルキャッシュで判定します。
効果: サーバー費用・運用監視・個人情報管理リスクがゼロ。タスク管理・RPGコアの全機能がオフラインで動作。
獲得EXPはexp_eventsテーブルへの追記のみで表現し、レベルや累計値は「再計算可能なキャッシュ」として扱います。レベル曲線を後から変更しても(実際に一度変更しました)、再計算関数を通すだけで既存ユーザーのデータが正しく移行されます。
効果: ストリーク・実績・統計21項目がすべて同じイベント列から純関数で導出でき、データ不整合が構造的に起きない。
スキーマ変更はALTER ADD / CREATEのみ許可し、破壊的変更を禁止。各バージョンのフィクスチャから最新版へ昇格するテストを常備し、どの旧バージョンのユーザーが更新しても安全にアップグレードされることを保証します。
効果: 開発期間を通じ、実データ入りの実機DBへのスキーマ変更9世代をデータ事故ゼロで完走(旧版フィクスチャからの昇格テストで保証)。
ゲームロジック(レベル計算・ストリーク・EXPブースト)は純関数にし、現在時刻・今日の日付はnow / todayStrとして引数注入。ロジック内部でDate.now()を呼ばないルールを徹底しました。
効果: 日付跨ぎ・タイムゾーン・うるう日のようなモバイル特有のエッジケースを366件のテストで固定化。
広告・課金・分析・共有・バックアップ・通知はすべてservices/に閉じ込め、画面コンポーネントからSDKを直接呼びません。APIキー未設定時は「安全な無効モード」で動作します。
効果: SDK差し替えやモック化が容易。ネイティブモジュール未搭載の旧ビルドでも起動不能にならない(動的import活用)。
レベル曲線・スキル52種・アバターパーツ84項目のカタログはTypeScript定数。型チェックがそのままデータ検証になり、パーツIDは削除禁止(deprecatedフラグで廃止)として後方互換を守ります。
効果: マスタ更新はアプリ更新と原子的に配布され、DBとの不整合が起きない。
色・タイポグラフィ・角丸・余白をトークン化し、hex値のコード直書きを禁止。アクセントは1色のみ、フォントウェイトは3段階のみという制約で、非デザイナーでも一貫したUIを維持できるようにしました。ドット絵はコンテンツ領域限定というルールで「Apple的なUI × RPGの世界観」を両立しています。
個人開発で見落とされがちな「出荷の実務」まで一通り経験しています
ゲームロジック・DBクエリ・マイグレーション昇格・バックアップ検証・通知プラン導出をカバー。DB層はモックではなく実SQLite(Node組み込み)で検証し、SQLの実挙動レベルで回帰を防ぎます。
VoiceOverでの到達不能トラップ(モーダルの要素畳み込み)への対処、開閉状態の読み上げ(accessibility state)、スクリーンリーダー使用時は自動クローズ演出を無効化するなどの配慮を実装。
日付跨ぎの画面追従(AppState+タイマー)、未来時刻データの不信用、バックアップ改ざん(永久ブースト・不正日付)の復元時検証、浮動小数点誤差を避けた整数EXP演算など。
マイルストーンごとにiPhone実機で検証してから次へ進む運用。iPad未検証のままリリースしない判断(iPhone専用として提出)など、「検証していないものは出さない」を徹底。
Claude Code(AIエージェント)を開発パートナーとして、人間は意思決定と検証に集中するプロセスを設計しました
この体制の狙いは「速さ」そのものではなく、仕様・テスト・レビューを省かずに速いこと。23日でApp Store公開まで到達できたのは、品質プロセスを保ったままAIで生産性を引き上げられることの実証だと考えています。
本アプリの開発から抽出した汎用技術のまとめは モバイルアプリ開発 汎用技術ガイド にまとめています。