家事を記録するだけではなく、家事を「いつ・何を・どうやるか考える負担」まで減らす。
周期、家事の負荷、休日、天気、Google Calendarの忙しさを考慮して、家事を行うタイミングを自動で調整する家事Plannerです。
Google Tasksとも連携し、Plannerが決めた予定を普段使うGoogle側で確認・完了できます。完了結果はPlannerへ戻り、実際に家事を行った日から次回予定を自動計算します。
家電については、メーカー名・製品名・型番からメーカー公式情報・公式説明書を確認し、AIでお手入れ方法を構造化します。
通常の家事管理・Scheduler・履歴は端末内のExpo SQLiteで動作し、外部APIが利用できない場合でも基本機能を継続できます。
動画は限定公開です。上記リンクから視聴できます。
家事予定を自動生成
↓
天気とGoogle Calendarの忙しさを考慮
↓
Google Tasksへ同期
↓
アプリ / Google側で完了
↓
完了履歴へ反映
↓
次回予定を自動計算
今日のタスク / 家事カレンダー / 公式説明書を利用した家電お手入れ解析
家事名を検索し、具体的な手順・注意事項・参照元まで確認できます。
家事には単純な「やる / やらない」以外にも、多くの判断が必要です。
- 何をやればいいのか分からない
- どのくらいの頻度で行えばいいのか分からない
- 今日やるべきか、数日ずらしてもいいのか分からない
- 休日にまとめて行いたい
- 重い家事が同じ日に集中すると負担が大きい
- 洗濯は天気によって予定を変えたい
- 忙しい日は負荷の高い家事を避けたい
- 家電のお手入れ方法を説明書から探すのが大変
- 完了した後、次にいつ行うか再び考える必要がある
一般的なToDoアプリでは、ユーザー自身が
何をする?
↓
いつする?
↓
期限は?
↓
終わった?
↓
次はいつ?
を継続して管理する必要があります。
このアプリでは、家事そのものだけではなく「家事を管理するための判断」も減らすことを目指しています。
何を?
→ 家事カタログ / 家電AI
いつ?
→ Scheduler / 休日 / 負荷 / 天気 / Google Calendar
どうやって?
→ 家事ガイド / メーカー公式説明書AI
終わった?
→ App / Widget / Google Tasks
次は?
→ 実際の完了日からSchedulerが再計算
家事ごとに、
- 実施周期
- 実施可能期間
- 家事の負荷
- 休日優先
- 前回の実施日
- 家事同士の依存関係
- 最大移動日数
を持ち、共通のSchedulerが予定を生成します。
例えば、
- 重い家事が同じ日に集中しないようにする
- 休日向きの家事を休日付近へ配置する
- 前回いつ行ったか分からない家事を初回から分散する
- 期限を過ぎた家事も消さず、現在の負荷に合わせて再提案する
- 実際に完了した日を次回周期の基準にする
- 家事同士の実行順序を維持する
といった処理を自動で行います。
予定日は固定された「締切」ではなく、一定範囲の中で移動できる実施可能期間として扱います。
例えば、
「明日は予定が多いので、重い掃除を今日へずらす」
といった判断をPlannerが行います。
Google Calendar連携を有効にすると、Calendarの忙しさを日ごとの時間量へ変換し、Schedulerの候補選択へ反映します。
ただし予定のある日を単純に禁止するわけではありません。
Calendarはsoft penaltyとして扱い、
- 家事の実施可能期間
- 最大移動日数
- 休日
- 1日の家事負荷
- 家事同士の依存関係
- 期限超過
などの既存ルールを維持します。
重い家事ほど忙しい日を避けやすくし、軽い家事は多少予定があっても近い日を維持しやすくしています。
さらに洗濯では、
天気条件を満たす日
+
Calendarの忙しさ
+
負荷上限
+
依存関係
+
同じ家事の周期順序
を組み合わせて候補日を決定します。
天気取得中に、
- 日付
- timezone
- Calendar
- 家事設定
- Plannerのsnapshot
が変更された場合、遅れて返ってきた古い結果を保存しません。
同じ予報の短時間での再評価も抑制し、不要なAPI通信・DB更新・Widget更新を増やさないようにしています。
Google Calendar連携で必要なのは、
「その日に何分予定が入っているか」
だけです。
そのためGoogle Calendar Events一覧ではなく、FreeBusy APIのみを利用します。
取得しないもの:
- 予定タイトル
- 説明
- 場所
- 参加者
- 主催者
- Event本文
取得したraw busy intervalもそのまま永続保存しません。
保存するのは日ごとの、
日付
busyMinutes
timezone
取得時刻
だけです。
家事の予定調整に不要なCalendar情報を取得しない設計にしています。
Plannerが生成した家事予定を専用のGoogle Tasksリストへ同期します。
新しいTaskを作る範囲は、当日から14日先までです。Planner内の長期予定は保持し、日が進むと対象範囲へ入った予定を追加します。既に紐付いたTaskは、範囲外でも予定日・名前・完了状態の更新を続けます。
作成・更新は1リクエストあたり最大100件に分割し、成功した項目から紐付けを保存します。途中で失敗した場合は、次の同期で残った差分を処理します。ローカル初期化後も、専用リストの家事名と予定日が一致するTaskを再利用して重複作成を抑えます。
Planner
↓
家事予定を生成
↓
Google Tasksへ同期
↓
Google Calendar上でも確認
Planner側で予定日が変わっても、Google Taskを削除・再作成しません。
同じGoogle Task IDを維持
+
dueだけ更新
します。
Google側で家事を完了した場合は、
Google Taskを完了
↓
Plannerへ取り込む
↓
完了履歴へ保存
↓
家事状態を更新
↓
Scheduler再計算
↓
次回予定生成
までつながります。
同じ完了を何度同期しても、完了履歴を二重生成しません。
家事の完了・完了取り消し後はGoogle Tasksをすぐ同期しますが、Calendarまで毎回再取得せず、Calendarは通常の更新間隔を維持します。
設定画面の「今すぐ同期」を実行した場合だけ、TasksとCalendarの両方を明示的に更新します。
ユーザーが設定した市区町村を使ってOpen-Meteoから予報を取得し、今後7日以内の洗濯予定を調整します。
候補日の判定では、
- 降水確率
- 降水量
- 天気コード
- 元の実施可能期間
- 1日の家事負荷
- 家事の依存関係
- Google Calendarの忙しさ
を利用します。
天気APIが利用できない場合は、通常Schedulerの予定へ戻ります。
端末GPSや位置情報権限は使用せず、ユーザーが入力・選択した市区町村のみを利用します。
予定だけ提示されても、
「で、どう掃除するの?」
が残ってしまいます。
そのため家事には、
- 手順
- 必要な道具
- 注意事項
- 参照元
- 過去の実施履歴
を持たせています。
例えば「シンク」で検索すると関連する家事を探すことができ、個別画面では水アカ除去などの具体的な手順を確認できます。
家電のお手入れでは、一般的なAI知識だけを使って回答させません。
メーカー名・製品名・型番
↓
メーカー公式情報から製品を確認
↓
対象型番の公式説明書を特定
↓
公式PDF / 公式資料をAIで解析
↓
お手入れ項目
手順
注意事項
周期
出典
を構造化
↓
ユーザーが確認
↓
保存
↓
周期がある項目だけSchedulerへ登録
製品同定と説明書検索ではメーカー公式情報を優先します。
例えばメーカー資料に、
定期的に確認する
とだけ書かれている場合、
30日に1回
のような数値周期をAIに推測させません。
この場合は、
定期予定なし
として保存します。
実際のDyson V12 Detect Slim(SV20)の解析画面でも、メーカーが具体的な周期を指定していない項目は「定期予定なし」として表示します。
公式製品ページ・公式取扱説明書へのリンクも保持し、解析内容の根拠をユーザー自身が確認できます。
このアプリの中心は、各機能を別々に使うことではなく、家事管理の判断を一周して自動化することです。
① 家事を登録
↓
② Schedulerが周期・負荷・休日から予定を生成
↓
③ 洗濯なら天気を考慮
↓
④ Google Calendarの忙しさを考慮
↓
⑤ Google Tasksへ同期
↓
⑥ Googleまたはアプリ側で完了
↓
⑦ Plannerへ完了履歴を保存
↓
⑧ 実際の完了日から次回予定を自動計算
家電については、
型番を入力
↓
公式製品を特定
↓
公式説明書を解析
↓
「どう手入れするか」を構造化
↓
周期があるものだけSchedulerへ追加
という別の入口から、同じPlannerへ統合します。
Google連携はmockだけでなく、iOS Simulator + 実Googleアカウントでも一連の動作を確認しています。
検証例:
11月24日
Calendar busy = 270分
11月23日
Calendar busy = 90分
↓
heavy家事を比較
11月24日
↓
11月23日へ移動
↓
同じGoogle Task IDを維持
dueだけ更新
↓
Google側でTaskを完了
↓
Plannerへ完了を1件だけ取り込み
↓
次回予定を再計算
↓
アプリを完全終了・再起動
↓
完了履歴・次回予定・Calendar状態を保持
つまり、
Calendar
↓
Scheduler
↓
Google Tasks
↓
Google側で完了
↓
Planner
↓
次回Scheduler
まで一周させています。
詳細:
docs/google-sync-phase1-report.mddocs/google-sync-phase2-report.mddocs/google-sync-phase3-report.mddocs/google-undo-and-audit-2026-10-25.md
家電AIについても、
「AIがそれっぽい回答をした」
だけでは評価していません。
メーカー公式説明書から人力で正解データを作成し、実際のアプリと同じAPI経路で比較しました。
対象:
Dyson V12 Detect Slim
型番: SV20
公式日本語取扱説明書
GPT-5.5を利用した3回のE2E検証:
| 指標 | 結果 |
|---|---|
| E2E成功 | 3 / 3 |
| 製品同定 | 3 / 3 |
| 正しい公式説明書 | 3 / 3 |
| Task Recall | 10 / 10 × 3 |
| Task Precision | 10 / 10 × 3 |
| 周期判定 | 10 / 10 × 3 |
| 主要手順 | 38 / 38 × 3 |
| 安全情報 | 33 / 33 × 3 |
| 出典 | 10 / 10 × 3 |
| 根拠のない生成 | 0 |
数値周期がメーカー資料に存在した項目以外には、根拠のない周期を生成しませんでした。
予定・天気・Calendar・完了・Google同期は、少しの不整合でも
- 同じ家事が二重に表示される
- 完了履歴が重複する
- 次回予定がずれる
- 天気取得中に古い結果で予定が巻き戻る
- GoogleとPlannerが互いに古い状態を上書きする
といった問題が起きやすい部分です。
そのため状態遷移・UI契約・保存・同期を自動テストしています。
| 検証 | 結果 |
|---|---|
| 自動テスト | 671 tests PASS(iOS・Androidの両条件) |
| lint | PASS |
| TypeScript typecheck | PASS |
npm run check |
PASS |
| Expo Doctor | PASS |
| GitHub Actions CI | PASS |
| 保護対象feature contract | 43機能 |
| iOS Simulator + 実Google E2E | PASS |
| Android Emulator + 実Google Tasks / Calendar Phase 3 E2E | PASS(2026-10-26) |
さらに天気・Calendarについては、128種類の予報・busyパターンを使い、
- 実施可能期間
- 負荷上限
- 依存順
- 周期順序
- 完了済み予定の固定
- 元データの不変性
を確認しています。
詳細:
docs/input-weather-calendar-audit-2026-10-26.mddocs/autosave-typography-audit-2026-10-26.mddocs/reliability-audit-2026-10-26.mddocs/mobile-readable-layout-2026-10-26.mddocs/android-google-e2e-2026-10-26.md
iOSとAndroidでnative部分の実装は完全には同一ではありません。
そのためGitHub Actionsにnative設定専用のworkflowを用意し、
npm ci
↓
Expo Doctor
↓
expo prebuild --platform android
を実行してAndroid native projectを生成できることも確認しています。
必要に応じてworkflow_dispatchからAndroid debug appのGradle compileも実行できる構成です。
2026年10月26日にはローカルでもAndroid nativeをクリーン再生成・再ビルドし、Android Emulator + 実GoogleアカウントでGoogle Tasks / Calendar Phase 3 E2E PASSを確認しました。FreeBusyによるheavy家事の移動、同じTask IDでのdue更新、Google側の完了取込、終了・再起動後の保持を検証記録にまとめています。
追加のAndroid機能検査と修正では、依存家事の周期の違い、同期中断後の完了操作、アプリ終了中のウィジェット完了、地域検索を確認しました。CIの画面テストはiOS・Androidの両条件で実行します。
Google Calendarの大量・障害・OS差分検査では、5,120ケースの集計照合、21家事・181日分の384配置パターン、15万区間の応答、SQLiteの部分失敗、両OSの認証経路を検査しました。両OSの実アカウントでもセッション復元、Calendar連携OFF/ON、181日分の再取得と同じTask IDの維持を確認しました。
保存・通知・家電APIなどの追加調査では、保存の終了経路、再入による同時書き込み、通知の部分失敗、iOSウィジェットの操作確認、古い履歴、APIの入力・受信上限、天気キャッシュを検査しました。100テストを追加し、既存の36保護項目を保持した上で43項目へ増やしています。Androidの初期設定・ゴミ・通知配信・家電AI登録と、iOSのXCTestによる8シナリオも確認しています。
Android物理端末と、物理端末上のBackgroundTaskは未検証です。
このRepositoryはJPHACKS公式テンプレートから開始しました。
Hack Day開始前の基準commit:
ecf5ec752e9dfd0b938c219662d7dbf3d6d1b603
Hack Dayでは主に以下を開発しました。
- 家事Planner UI
- SQLiteデータモデル
- 家事Scheduler
- 実施可能期間
- 家事負荷分散
- 休日優先
- 家事依存関係
- 期限超過家事の再提案
- 完了・完了取り消し
- 月間カレンダー
- 家事検索
- 家事ガイド
- ゴミ収集日
- 通知
- iOS / Android Widget
- Open-Meteo天気連動
- 家電公式説明書AI
- Google Tasks同期
- Google側完了のPlanner取込
- Google Calendar FreeBusy連携
- Calendar busyを使ったScheduler調整
- 天気とCalendarの統合調整
- mobile UI / typography改善
- 設定の自動保存
- 自動テスト / CI
- Android native configuration CI
現在との差分:
https://github.com/jphacks/tkb_2633/compare/ecf5ec752e9dfd0b938c219662d7dbf3d6d1b603...main
各外部サービスがそれぞれ別々に予定を作るのではなく、
周期
+
実施可能期間
+
負荷
+
休日
+
依存関係
+
天気
+
Calendar busy
を最終的に一つのSchedulerへ統合しています。
主要コード:
src/domain/scheduling/engine.tssrc/domain/scheduling/calendar-penalty.tssrc/domain/scheduling/completion-matching.ts
例えば、
晴れているので洗濯したい
という条件だけで日付を変更すると、
その日はCalendar上では非常に忙しい
という問題が起こります。
逆にCalendarだけを見ると雨の日へ洗濯を移動してしまう可能性があります。
そのため、
天気条件を満たす
↓
実施期間・負荷・依存関係を満たす
↓
Calendar busyも比較する
↓
候補日を決定
という順序で統合しています。
主要コード:
src/features/weather/laundry-policy.tssrc/features/weather/optimize-laundry-schedule.tssrc/features/google-sync/calendar-availability.ts
Calendarの内容を家事Plannerが読む必要はありません。
そのためFreeBusyだけを使い、
予定の中身
ではなく、
予定が入っている時間量
だけをSchedulerへ渡します。
主要コード:
src/platform/google-tasks/google-calendar-freebusy-client.tssrc/features/google-sync/calendar-coordinator.ts
予定日が変わるたびにGoogle Taskを削除・再作成すると、
- 重複
- ID変更
- 完了履歴の対応崩れ
が発生しやすくなります。
そのため同一予定では同じGoogle Taskを維持し、必要な値だけ更新します。
主要コード:
src/features/google-sync/coordinator.tssrc/features/google-sync/reconcile-google-tasks.tssrc/platform/google-tasks/google-tasks-api.ts
家電AIは、
Product Resolver
↓
Manual Resolver
↓
Manual Analyzer
へ処理を分離しています。
主要コード:
server/appliance-care-api/src/product-resolver.mjsserver/appliance-care-api/src/manual-resolver.mjsserver/appliance-care-api/src/manual-analyzer.mjsserver/appliance-care-api/src/official-domains.mjs
通常の家事管理は端末内で完結します。
外部サービスは補助機能として接続し、外部API障害によって基本Schedulerまで停止しない構成です。
flowchart TD
UI["React Native / Expo UI"]
Scheduler["Domain Scheduler"]
SQLite["Expo SQLite"]
Weather["Open-Meteo"]
Calendar["Google Calendar FreeBusy"]
Tasks["Google Tasks"]
Appliance["Appliance Care API"]
Official["メーカー公式情報 / 公式説明書"]
OpenAI["OpenAI Responses API"]
UI --> Scheduler
Scheduler <--> SQLite
Weather --> Scheduler
Calendar --> Scheduler
Scheduler --> Tasks
Tasks --> Scheduler
UI --> Appliance
Official --> Appliance
Appliance --> OpenAI
Appliance --> UI
詳細:
Planner本体の家事DBは端末内SQLiteが正本です。
Google Tasksをクラウド上のPlanner DBとして利用しているわけではありません。
Google Tasksは、
- Plannerが決めた予定をGoogle環境で確認する
- Google側から家事完了を入力する
ための外部インターフェースとして扱います。
そのため、
- Plannerアカウント
- 家族間データ共有
- 複数端末間Planner DB同期
とは別機能です。
端末GPSは利用しません。
ユーザーが入力・選択した市区町村を利用します。
FreeBusyのみを利用し、Event内容を取得しません。
メーカー公式情報・公式説明書を基準にし、出典を保持します。
通常の家事データは端末内SQLiteへ保存します。
- 初回セットアップ
- 家事頻度モード
- 家事ごとの周期設定
- 休日設定
- 家事ON / OFF
- 前回実施時期
- 家事負荷
- 実施可能期間
- 最大移動日数
- 家事依存関係
- 期限超過再提案
- 完了 / 未完了履歴
- 完了取り消し
- 月間カレンダー
- 家事検索
- 家事説明
- 家事設定の自動保存
- Open-Meteo天気連動
- Google Calendar FreeBusy連動
- Google Tasks連携
- Google Tasks完了取込
- 天気 + Calendar統合予定調整
- 毎朝の家事通知
- iOS Widget
- Android Widget
- Widgetからの完了
- ゴミ収集曜日
- カレンダー上のゴミ種別表示
- 家電登録
- メーカー / 製品 / 型番確認
- 公式製品情報確認
- 公式説明書検索
- OpenAI Responses API解析
- お手入れ項目
- 手順
- 注意事項
- 周期
- 公式出典
- AI結果のユーザー確認
- 再解析
- 周期あり項目のScheduler登録
実装済みと実機検証済みを混同しないため、未確認部分も明記します。
Android native projectの生成はCIで確認しています。
Android Emulator + 実GoogleアカウントのGoogle Tasks / Calendar Phase 3 E2Eは2026年10月26日にPASSしました。Android物理端末は未検証です。
物理端末上でOSに長時間任せたBackgroundTask実行は未検証です。
アプリ起動・foreground復帰・手動同期でも状態を再確認します。
通常の曜日・月次ルールには対応しています。
自治体による祝日・臨時変更などの自動取得は未実装です。
MVPでは、
- Plannerアカウント
- 家族間同期
- 複数端末同期
- Planner DBのクラウド保存
は対象外です。
- TypeScript
- React 19
- React Native 0.88
- Expo SDK 58
- Expo Router
- Expo SQLite
- Expo Notifications
- Expo Background Task
- Expo Widgets
- Google Sign-In native SDK
- Google Tasks API
- Google Calendar FreeBusy API
- react-native-nitro-google-signin
- Open-Meteo Forecast API
- Open-Meteo Geocoding API
- OpenAI Responses API
- Structured Outputs
- PDF input
- メーカー公式Web / 公式説明書解析
- Node Test Runner
- ESLint
- TypeScript
- Expo Doctor
- GitHub Actions
- Feature contract tests
- Android native configuration check
このアプリはnative機能を利用するため、完全な動作確認にはExpo development buildを使用します。
npm cinpm run iosnpm run androiddevelopment buildを作成済みの場合:
npm start環境変数の例:
APIサーバー:
npm run api:devOpenAI API keyをクライアントアプリへ直接埋め込まない構成です。
Google Cloud側のOAuth設定とdevelopment buildが必要です。
詳細:
Calendar連携ではGoogle Tasksとは別に、ユーザーがCalendar連携を有効にした場合だけFreeBusy用の追加権限を要求します。
全テスト:
npm testAndroid条件で画面の処理も含めて実行:
HOUSEWORK_TEST_PLATFORM=android npm testlint:
npm run linttypecheck:
npm run typecheckまとめて確認:
npm run checkExpo Doctor:
npm run doctorsrc/
├── app/ # Expo Router / 各画面
├── components/ # UI部品
├── domain/
│ ├── chores/ # 家事定義
│ └── scheduling/ # Scheduler
├── features/
│ ├── appliance-care/ # 家電AI
│ ├── google-sync/ # Google Tasks / Calendar
│ ├── notifications/ # 通知
│ ├── planner/ # Planner更新制御
│ ├── settings/ # 設定・自動保存
│ ├── weather/ # 天気
│ ├── waste/ # ゴミ収集日
│ └── widgets/ # Widget
└── platform/
├── google-tasks/ # Google API adapter
├── notifications/
├── storage/ # SQLite
└── widgets/
server/
└── appliance-care-api/
└── src/
├── product-resolver.mjs
├── manual-resolver.mjs
├── manual-analyzer.mjs
└── analysis-runner.mjs
tests/
└── *.test.mjs
docs/
├── architecture.md
├── google-sync-phase1-report.md
├── google-sync-phase2-report.md
├── google-sync-phase3-report.md
├── google-sync-setup.md
└── input-weather-calendar-audit-2026-10-26.md
- 実利用者による継続利用テスト
- Schedulerの長期利用データによる調整
- 家事・家電データの拡充
- Android物理端末での実GoogleアカウントE2E
- Android / iOS物理端末でのBackgroundTask検証
- Plannerの複数端末同期
- 家族単位での共有
- ゴミ収集日の自治体別例外対応
- 家電AI解析結果の再利用・共有cache
家電AIについては、同じ製品・同じ公式説明書を毎回AI解析するのではなく、
製品型番
↓
公式説明書
↓
検証済み解析結果
を再利用することで、解析コストを抑えながら対応製品を増やす構成へ拡張できます。
家事を実行すること自体は自動化できなくても、
何をやる?
いつやる?
どうやる?
前回いつやった?
今日やるべき?
忙しいからずらす?
天気は大丈夫?
次はいつ?
を毎回人間が考える必要はありません。
家事をする人ではなく、「家事を管理する人」の負担を減らす。
それがこのアプリの目標です。






