予定管理に「疲労」「睡眠」「移動」の観点を加え、無理のないスケジュール作成と 「心のゆとり」 を支援するモバイルアプリです。
- エネルギー残量表示 — 今日の体力を 0〜100% のバッテリーで可視化
- マスコット「ココ」 — エネルギー残量に応じて4段階の表情に変化(アプリアイコンも連動)
- 今日のスケジュール一覧 — 開始・終了時間、場所、移動時間、疲労度を一覧表示
- 疲労・睡眠・移動時間を考慮した 最適な時間帯を最大3つ提案
- 各候補に マッチ率 を表示(おすすめ / 安定ペース / 高負荷)
- 提案ごとの エネルギー推移グラフ で影響をプレビュー
- アラート機能 — 予定を追加することで負担が過大になる場合に、未然にアラートで通知。
- 月ビュー — 疲労ヒートマップで忙しさを色で可視化。日付タップでボトムシート、そこから日ビューへ遷移
- 週ビュー — タイムグリッド上にイベントブロック + 終日予定も表示
- 日ビュー — 1時間ごとのエネルギー推移バーチャート + タイムライン形式の予定表示 + 移動時間の表示
- 年月ピッカー — 全ビュー共通。ヘッダータップで年月選択モーダルを開き、遠い月へ即ジャンプ。週・日ビューでは月選択→日付選択の2ステップ
- Google Routes API とApple MapKitで前後の予定間の 移動時間を自動計算
- 7種の交通手段に対応(徒歩 / 自転車 / 電車 / バス / 車 / バイク / タクシー)
- 日ビューではイベント間に 移動カード を表示
- イベント後フィードバック — 4段階の絵文字評価(元気 → とても疲れた)+ メモ
- 1日の終わりフィードバック — その日全体の疲労を4段階で評価
- フィードバックを蓄積し、個人に合わせた 疲労予測の精度を継続的に改善
- イベントタイトルごとの統計で、繰り返す予定の疲労を学習
- 予定リマインダー(10分前)
- フィードバック催促(予定終了5分後)
- 睡眠アラート
- エネルギー枯渇警告(残量30%以下)
- Google Calendar 双方向同期 — 増分syncTokenで効率的に同期
- 場所オートコンプリート — Google Places API で場所を検索・選択
- オフライン対応 — AsyncStorage によるローカルキャッシュ。オフラインでも閲覧可能
- データリセット — Firestore + キャッシュの全データ削除(Google Calendar は影響なし)
| 技術 |
バージョン |
用途 |
| React Native |
0.83.2 |
クロスプラットフォームUI |
| Expo |
55.0.0 |
開発・ビルド基盤 |
| TypeScript |
5.9.2 |
型安全な開発 |
| Expo Router |
55.0.5 |
ファイルベースルーティング |
| React Native Reanimated |
4.2.1 |
ボトムシートアニメーション |
| React Native Gesture Handler |
2.30.0 |
スワイプ・ジェスチャー操作 |
| 技術 |
バージョン |
用途 |
| Firebase Cloud Functions |
6.6.0 |
サーバーレスAPI |
| Firebase Admin SDK |
13.6.0 |
Firestore管理 |
| Node.js |
20 |
ランタイム |
本アプリは 10種類以上の Google 技術 を統合的に活用しています。
| 技術 |
活用内容 |
| Google Sign-In |
OAuth 2.0 によるワンタップログイン。Calendar API のアクセストークンも同時取得 |
| Firebase Authentication |
Google プロバイダによるユーザー管理 |
| Cloud Firestore |
ユーザー設定・イベントメタデータ・フィードバック・学習データの永続化 |
| Cloud Functions |
AI処理のサーバーレス実行基盤 |
| 技術 |
活用内容 |
| Google Calendar API |
予定の双方向同期(読み取り・作成・更新・削除)。syncToken による増分同期で効率化。初回は6ヶ月分を取得 |
| 技術 |
活用内容 |
| Google Routes API |
前後の予定間の移動時間を自動算出。Distance Matrix v2 を使用し、5種の交通手段(徒歩/自転車/車/バイク/タクシー)に対応 |
| Google Places API |
予定追加時の場所オートコンプリート。セッションベースのトークン管理で効率的にAPI呼び出し |
| Google Geocoding API |
初期設定で入力した自宅住所を座標に変換。移動時間計算の基点として使用 |
| 技術 |
活用内容 |
Vertex AI Embeddings (gemini-embedding-001) |
イベントタグのベクトル埋め込みを生成。コサイン類似度(閾値0.72)で既存タグとのセマンティックマッチングを実現し、類似タグの重複を防止 |
Vertex AI Generative (gemini-2.5-flash-lite) |
イベントタイトルからのタグ自動提案(3〜4候補を生成) |
- Node.js 20+
- Expo CLI
- Firebase プロジェクト
- Google Cloud プロジェクト(Calendar API, Routes API, Places API, Geocoding API, Vertex AI を有効化)
mobile/.env に以下を設定:
# Firebase
EXPO_PUBLIC_FIREBASE_API_KEY=
EXPO_PUBLIC_FIREBASE_AUTH_DOMAIN=
EXPO_PUBLIC_FIREBASE_PROJECT_ID=
EXPO_PUBLIC_FIREBASE_STORAGE_BUCKET=
EXPO_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
EXPO_PUBLIC_FIREBASE_APP_ID=
EXPO_PUBLIC_FIREBASE_FUNCTIONS_REGION=asia-northeast1
# Google OAuth
EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID=
EXPO_PUBLIC_GOOGLE_IOS_CLIENT_ID=
EXPO_PUBLIC_GOOGLE_IOS_URL_SCHEME=
# Google Maps / Routes / Places
EXPO_PUBLIC_GOOGLE_MAPS_API_KEY=
# モバイルアプリ
cd mobile
npm install
npx expo start
# Cloud Functions
cd functions
npm install
npm run deploy
Google Sign-In はネイティブモジュールを使用するため、実機または development build での確認を推奨します。
SchedulingAssistant/
├── mobile/ # React Native (Expo) アプリ
│ ├── app/ # 画面(Expo Router)
│ │ ├── (tabs)/ # タブ画面(ホーム/カレンダー/設定)
│ │ ├── addevent.tsx # 予定追加・編集
│ │ ├── suggest.tsx # AIレコメンド
│ │ ├── feedback.tsx # イベントフィードバック
│ │ ├── daily-feedback.tsx # 1日の終わりフィードバック
│ │ └── setup.tsx # 初期設定・オンボーディング
│ ├── services/ # ビジネスロジック(23モジュール)
│ │ ├── fatigue.ts # 疲労計算エンジン
│ │ ├── energy.ts # エネルギー算出
│ │ ├── recommendation.ts # レコメンドエンジン
│ │ ├── travel-time.ts # 移動時間算出
│ │ ├── calendar-sync.ts # Google Calendar同期
│ │ └── ...
│ ├── components/ # UIコンポーネント
│ ├── hooks/ # カスタムフック
│ ├── repositories/ # データアクセス層
│ ├── types/ # TypeScript型定義
│ └── constants/ # 定数・デフォルトデータ
├── functions/ # Firebase Cloud Functions
│ └── src/index.ts # Vertex AI連携(タグ提案・埋め込み・文章生成)
└── firebase.json # Firebase設定