PORTFOLIO — 個人開発iOSアプリ

QuesToDo — タスク管理を、冒険にする。

やることを「クエスト」に見立て、完了すると経験値が入りドット絵の冒険者が成長していくRPG風ToDoアプリ。 企画・設計から実装・収益化・App Store公開まで、23日間で一人で完遂しました(2026年8月7日リリース)。

App Storeで公開中 → React Native / Expo TypeScript strict 完全サーバーレス サブスク課金 + 広告収益化

採用ご担当者さまへ — 30秒サマリー

  • 0→1をひとりで:要件定義・仕様書5本・UI設計・実装・テスト・課金/広告組み込み・ストア審査対応まで全工程を単独で実施
  • 商用水準の機能一式:サブスクリプション(月額/年額/買い切り)、リワード/バナー広告、プロダクト分析、ローカル通知、日英対応、バックアップ
  • 保守を前提とした設計:strict TypeScript・自動テスト366件・追記型DBマイグレーション9世代・外部SDKの層分離
  • AIエージェント活用:Claude Codeを開発パートナーとして運用し、仕様書駆動+マルチエージェント相互レビューのプロセスを設計。23日での公開到達はこの生産性設計の実証です
ホーム画面: ドット絵アバターとレベル、今日のクエスト
ホーム — アバターとEXPブースト
クエスト一覧画面: 検索・タブ・並び替え
クエスト一覧 — 検索/繰り返し/並び替え
アバター着せ替え画面: パーツグリッド
着せ替え — 84パーツをレベルで解放
きろく画面: 統計タイルとグラフ
きろく — プレミアム限定の統計

01数字で見るQuesToDo

2026-07-16 開発開始 → 2026-08-02 審査提出 → 2026-08-07 App Storeで公開

23
企画→App Store公開
13,701
実装コード(86ファイル・テスト除く)
366
自動テスト(全パス)
11画面
S-00〜S-10
9世代
DBマイグレーション
108
ドット絵(全て自動生成)
52
スキル(魔法/とくぎ/称号)
3商品
アプリ内課金
2言語
日本語 / 英語
71
gitコミット

02主要機能

「タスク管理が続かないのは、消しても何も起きないから」— 完了のたびに成長が見える体験を設計

📋 クエスト管理(ToDoコア)

繰り返し4種(毎日/曜日指定/隔週/N日ごと)、期限+時刻、優先度、ジャンル、入れ子フォルダ、横断検索、8種の並び替え、ドラッグ&ドロップ、完了の取り消し、ゴミ箱(30日自動パージ)

⚔️ RPGコア

難易度別EXP・レベル曲線・連続達成ストリーク・ステータス割り振り・スキル52種(1日1回発動でEXPブーストの実効果つき)・行動で解放される実績称号16種。魔法・とくぎは9系統のエフェクトに紐づく

🎨 ドット絵アバター

髪/服/アクセサリ/武器/盾など81パーツ(+「装備しない」3項目)をレベルで解放して着せ替え。完了演出では9系統の発動エフェクトがアニメーション。ドット絵108枚はすべて自作スクリプトで生成

💰 収益化

プレミアム(広告非表示+統計解放)を月額/年額/買い切りの3プランで提供。無料ユーザーにはバナー広告と、視聴で30分EXP2倍になるリワード広告「ブーストタイム」

🔔 継続の仕組み

ローカル通知3種(デイリー/期限/ストリーク防衛)、初回オンボーディング、レビュー促進の2経路(レベルアップ直後だけの自動プロンプト+設定からいつでも書ける「アプリをレビューする」導線)、レベルアップのX共有カード、統計「きろく」21項目+グラフ3種

🔒 データ所有権

アカウント登録なし・データは全て端末内。JSONバックアップのエクスポート/インポート(検証付き)に対応し、課金状態は改ざん耐性のためバックアップから除外

03技術スタック

主要ライブラリと採用理由

言語 / FWTypeScript 5.9(strict・any禁止) / React Native 0.81 / Expo SDK 54
UIReact 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を除去)
i18ni18next / react-i18next — 表示文字列のハードコード禁止、ja/en 約700キー
テストJest + ts-jest — DB層はNode組み込みSQLiteに差し替えて実SQLでテスト(モックではなく実挙動を検証)
ビルド/配信EAS Build / EAS Submit(証明書・APIキー管理を非対話化) / TestFlight / GitHub
開発支援Claude Code(AIエージェント)/pngjs(ドット絵・アイコン・スクショ加工の自動生成スクリプト群)

04アーキテクチャと設計判断

「なぜそうしたか」を説明できることを重視しています

完全サーバーレス(運用コスト0円)

個人開発の持続可能性を最優先し、バックエンドを持たない構成に。データの真実は端末内SQLite、課金状態のみRevenueCatを真実とし、オフライン時は7日猶予付きローカルキャッシュで判定します。

効果: サーバー費用・運用監視・個人情報管理リスクがゼロ。タスク管理・RPGコアの全機能がオフラインで動作。

EXPはイベントソーシング的に管理

獲得EXPはexp_eventsテーブルへの追記のみで表現し、レベルや累計値は「再計算可能なキャッシュ」として扱います。レベル曲線を後から変更しても(実際に一度変更しました)、再計算関数を通すだけで既存ユーザーのデータが正しく移行されます。

効果: ストリーク・実績・統計21項目がすべて同じイベント列から純関数で導出でき、データ不整合が構造的に起きない。

追記型DBマイグレーション(v1→v9)

スキーマ変更はALTER ADD / CREATEのみ許可し、破壊的変更を禁止。各バージョンのフィクスチャから最新版へ昇格するテストを常備し、どの旧バージョンのユーザーが更新しても安全にアップグレードされることを保証します。

効果: 開発期間を通じ、実データ入りの実機DBへのスキーマ変更9世代をデータ事故ゼロで完走(旧版フィクスチャからの昇格テストで保証)。

テスト容易性を前提にした関数設計

ゲームロジック(レベル計算・ストリーク・EXPブースト)は純関数にし、現在時刻・今日の日付はnow / todayStrとして引数注入。ロジック内部でDate.now()を呼ばないルールを徹底しました。

効果: 日付跨ぎ・タイムゾーン・うるう日のようなモバイル特有のエッジケースを366件のテストで固定化。

外部SDKはservices/層に隔離

広告・課金・分析・共有・バックアップ・通知はすべてservices/に閉じ込め、画面コンポーネントからSDKを直接呼びません。APIキー未設定時は「安全な無効モード」で動作します。

効果: SDK差し替えやモック化が容易。ネイティブモジュール未搭載の旧ビルドでも起動不能にならない(動的import活用)。

マスタデータはDBではなくコードで管理

レベル曲線・スキル52種・アバターパーツ84項目のカタログはTypeScript定数。型チェックがそのままデータ検証になり、パーツIDは削除禁止(deprecatedフラグで廃止)として後方互換を守ります。

効果: マスタ更新はアプリ更新と原子的に配布され、DBとの不整合が起きない。

デザインシステムの自作

色・タイポグラフィ・角丸・余白をトークン化し、hex値のコード直書きを禁止。アクセントは1色のみ、フォントウェイトは3段階のみという制約で、非デザイナーでも一貫したUIを維持できるようにしました。ドット絵はコンテンツ領域限定というルールで「Apple的なUI × RPGの世界観」を両立しています。

05ストアリリース対応(審査・法務・収益化の実務)

個人開発で見落とされがちな「出荷の実務」まで一通り経験しています

06品質への取り組み

自動テスト 366件

ゲームロジック・DBクエリ・マイグレーション昇格・バックアップ検証・通知プラン導出をカバー。DB層はモックではなく実SQLite(Node組み込み)で検証し、SQLの実挙動レベルで回帰を防ぎます。

アクセシビリティ

VoiceOverでの到達不能トラップ(モーダルの要素畳み込み)への対処、開閉状態の読み上げ(accessibility state)、スクリーンリーダー使用時は自動クローズ演出を無効化するなどの配慮を実装。

エッジケース設計

日付跨ぎの画面追従(AppState+タイマー)、未来時刻データの不信用、バックアップ改ざん(永久ブースト・不正日付)の復元時検証、浮動小数点誤差を避けた整数EXP演算など。

実機ファースト

マイルストーンごとにiPhone実機で検証してから次へ進む運用。iPad未検証のままリリースしない判断(iPhone専用として提出)など、「検証していないものは出さない」を徹底。

07開発プロセス — AI時代の個人開発

Claude Code(AIエージェント)を開発パートナーとして、人間は意思決定と検証に集中するプロセスを設計しました

仕様書駆動(Docs as Source of Truth)
要件・画面設計・データ設計・環境構築・デザイントークンの5文書を「正」とし、コードより先に仕様書を更新。実装との矛盾はエラーとして扱う
マイルストーン駆動(M1〜M8)
1依頼=1マイルストーン。完了ごとに実機確認・gitコミット。先回り実装を禁止し、常に動く状態を維持
マルチエージェント相互レビュー
実装のたびに複数のAIエージェントが独立レビュー→敵対的検証で確証した指摘のみ修正。バックアップ復元の脆弱性やa11yトラップ等を出荷前に検出
人間は「決める・確かめる・説明できる」に責任を持つ
実装・調査・ストア入力作業はAIに委任しつつ、機能の取捨選択・UX判断・実機検証・課金/広告の意思決定は人間が実施。設計判断とコードの中身は人間が把握し説明責任を持つ体制(面接でのコードウォークスルー可能です)

この体制の狙いは「速さ」そのものではなく、仕様・テスト・レビューを省かずに速いこと。23日でApp Store公開まで到達できたのは、品質プロセスを保ったままAIで生産性を引き上げられることの実証だと考えています。

本アプリの開発から抽出した汎用技術のまとめは モバイルアプリ開発 汎用技術ガイド にまとめています。