22 Commits

Author SHA1 Message Date
fe7ba21061 chore(release): add rsync to release workflow dependencies 2026-03-16 20:58:25 +01:00
90ff66223c docs: create milestone v1.1 roadmap (3 phases) 2026-03-16 20:54:40 +01:00
b7a243603c docs: define milestone v1.1 requirements 2026-03-16 20:50:20 +01:00
fa26d6b301 chore(release): install fdroidserver via pip for compatibility with modern Flutter/AGP APKs 2026-03-16 20:45:09 +01:00
6bb1bc35d7 docs: start milestone v1.1 Calendar & Polish 2026-03-16 20:44:51 +01:00
ead085ad26 fix(android): move MainActivity to correct package to fix ClassNotFoundException
The namespace/applicationId is `de.jeanlucmakiola.household_keeper` but
MainActivity was in the old `com.jlmak.household_keeper` package, causing
a crash on launch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 20:39:08 +01:00
74a801c6f2 chore(release): enhance release workflow to safely handle APK naming with ref-based fallback 2026-03-16 20:30:40 +01:00
0059095e38 chore(release): make sudo usage optional in release workflow setup steps 2026-03-16 20:14:31 +01:00
8c72403c85 chore: archive v1.0 phase directories to milestones/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 20:12:01 +01:00
1a1a10c9ea chore: complete v1.0 MVP milestone
Some checks failed
Build and Release to F-Droid / build-and-deploy (push) Has been cancelled
Archive roadmap and requirements to milestones/, evolve PROJECT.md
with validated requirements and decision outcomes, reorganize
ROADMAP.md with milestone grouping, create retrospective.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 20:10:01 +01:00
36126acc18 chore(android): migrate build.gradle.kts to use Kotlin idioms for properties and improve readability 2026-03-16 19:51:53 +01:00
76192e22fa chore(release): improve Android SDK setup and toolchain verification in workflow 2026-03-16 19:42:04 +01:00
9c2ae12012 chore(release): add Android SDK setup steps to workflow 2026-03-16 19:36:09 +01:00
dcb2cd0afa chore(release): trust Flutter SDK directories in workflow to fix safe directory errors 2026-03-16 19:29:50 +01:00
c2570cdc01 chore(release): remove explicit Flutter version specification in workflow 2026-03-16 19:09:37 +01:00
3c2ad5c7c6 chore(release): add jq installation step in workflow for JSON parsing 2026-03-16 19:06:59 +01:00
f6272a39b4 chore(release): update workflow to use Docker runner instead of Ubuntu 2026-03-16 19:00:14 +01:00
170326dd85 Merge remote-tracking branch 'origin/Develop' into Develop
# Conflicts:
#	.gitea/workflows/release.yaml
2026-03-16 18:55:15 +01:00
74de67de59 fix(release): correct indentation in release workflow script 2026-03-16 18:54:39 +01:00
b0765795b8 Update .gitea/workflows/release.yaml 2026-03-16 17:53:13 +00:00
489c0d5c4f add manual trigger support to release workflow 2026-03-16 18:51:49 +01:00
967dc7d09a broaden release trigger from 'v*' to all tags in workflow config 2026-03-16 18:43:29 +01:00
53 changed files with 632 additions and 347 deletions

View File

@@ -3,11 +3,15 @@ name: Build and Release to F-Droid
on: on:
push: push:
tags: tags:
- 'v*' - '*'
workflow_dispatch:
jobs: jobs:
build-and-deploy: build-and-deploy:
runs-on: ubuntu-latest runs-on: docker
env:
ANDROID_HOME: /opt/android-sdk
ANDROID_SDK_ROOT: /opt/android-sdk
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -18,12 +22,67 @@ jobs:
distribution: 'zulu' distribution: 'zulu'
java-version: '17' java-version: '17'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Install Android SDK packages
run: |
sdkmanager --licenses >/dev/null <<'EOF'
y
y
y
y
y
y
y
y
y
y
EOF
sdkmanager "platform-tools" "platforms;android-36" "build-tools;36.0.0"
- name: Install jq
run: |
set -e
SUDO=""
if command -v sudo >/dev/null 2>&1; then
SUDO="sudo"
fi
if command -v apt-get >/dev/null 2>&1; then
$SUDO apt-get update
$SUDO apt-get install -y jq
elif command -v apk >/dev/null 2>&1; then
$SUDO apk add --no-cache jq
elif command -v dnf >/dev/null 2>&1; then
$SUDO dnf install -y jq
elif command -v yum >/dev/null 2>&1; then
$SUDO yum install -y jq
else
echo "Could not find a supported package manager to install jq"
exit 1
fi
- name: Setup Flutter - name: Setup Flutter
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
flutter-version: '3.11.0'
channel: 'stable' channel: 'stable'
- name: Trust Flutter SDK git directory
run: |
set -e
FLUTTER_BIN_DIR="$(dirname "$(command -v flutter)")"
FLUTTER_SDK_DIR="$(cd "$FLUTTER_BIN_DIR/.." && pwd -P)"
git config --global --add safe.directory "$FLUTTER_SDK_DIR"
if [ -n "${FLUTTER_ROOT:-}" ]; then
git config --global --add safe.directory "$FLUTTER_ROOT"
fi
# Runner-specific fallback observed in failing logs
git config --global --add safe.directory /opt/hostedtoolcache/flutter/stable-3.41.4-x64 || true
- name: Verify Android + Flutter toolchain
run: flutter doctor -v
- name: Install dependencies - name: Install dependencies
run: flutter pub get run: flutter pub get
@@ -34,10 +93,10 @@ jobs:
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
run: | run: |
# Decode the base64 string back into the binary .jks file # Decode the base64 string back into the binary .jks file
echo "$KEYSTORE_BASE64" | base64 --decode > android/app/upload-keystore.jks echo "$KEYSTORE_BASE64" | base64 --decode > android/app/upload-keystore.jks
# Create the key.properties file that build.gradle expects # Create the key.properties file that build.gradle expects
echo "storePassword=$KEY_PASSWORD" > android/key.properties echo "storePassword=$KEY_PASSWORD" > android/key.properties
echo "keyPassword=$KEY_PASSWORD" >> android/key.properties echo "keyPassword=$KEY_PASSWORD" >> android/key.properties
echo "keyAlias=$KEY_ALIAS" >> android/key.properties echo "keyAlias=$KEY_ALIAS" >> android/key.properties
@@ -48,8 +107,15 @@ jobs:
- name: Setup F-Droid Server Tools - name: Setup F-Droid Server Tools
run: | run: |
sudo apt-get update SUDO=""
sudo apt-get install -y fdroidserver sshpass if command -v sudo >/dev/null 2>&1; then
SUDO="sudo"
fi
$SUDO apt-get update
# sshpass from apt, fdroidserver via pip to get a newer androguard that
# can parse modern Flutter/AGP APKs (apt ships fdroidserver 2.2.1 which crashes)
$SUDO apt-get install -y sshpass rsync python3-pip
pip3 install --break-system-packages --upgrade fdroidserver
- name: Initialize or fetch F-Droid Repository - name: Initialize or fetch F-Droid Repository
env: env:
@@ -66,10 +132,17 @@ jobs:
- name: Copy new APK to repo - name: Copy new APK to repo
run: | run: |
# The app-release.apk name should ideally include the version number set -e
# so it doesn't overwrite older versions in the repo. mkdir -p fdroid/repo
VERSION_TAG=${GITHUB_REF#refs/tags/} # gets 'v1.0.0'
cp build/app/outputs/flutter-apk/app-release.apk fdroid/repo/my_flutter_app_${VERSION_TAG}.apk # Prefer tag name for release builds; fallback to ref name for manual runs.
REF_NAME="${GITHUB_REF_NAME:-${GITHUB_REF##*/}}"
SAFE_REF_NAME="$(echo "$REF_NAME" | tr '/ ' '__' | tr -cd '[:alnum:]_.-')"
if [ -z "$SAFE_REF_NAME" ]; then
SAFE_REF_NAME="${GITHUB_SHA:-manual}"
fi
cp build/app/outputs/flutter-apk/app-release.apk "fdroid/repo/my_flutter_app_${SAFE_REF_NAME}.apk"
- name: Generate F-Droid Index - name: Generate F-Droid Index
run: | run: |

20
.planning/MILESTONES.md Normal file
View File

@@ -0,0 +1,20 @@
# Milestones
## v1.0 MVP (Shipped: 2026-03-16)
**Phases completed:** 4 phases, 13 plans
**Codebase:** 10,588 LOC Dart (7,773 lib + 2,815 test), 89 tests, 76 commits
**Timeline:** 2 days (2026-03-15 to 2026-03-16)
**Key accomplishments:**
1. Flutter project with Drift SQLite, Riverpod 3 state management, ARB localization, and calm sage & stone Material 3 theme
2. Full room CRUD with drag-and-drop reorder, icon picker, and cleanliness indicator per room card
3. Task CRUD with 11 frequency presets + custom intervals, calendar-anchored scheduling with anchor memory, and auto-calculated next due dates
4. Bundled German-language task templates for 14 room types with post-creation template picker
5. Daily plan home screen with overdue/today/tomorrow sections, animated checkbox completion, and progress tracking
6. Daily summary notification with configurable time, POST_NOTIFICATIONS permission handling, and boot receiver rescheduling
**Archive:** See `milestones/v1.0-ROADMAP.md` and `milestones/v1.0-REQUIREMENTS.md`
---

View File

@@ -2,30 +2,46 @@
## What This Is ## What This Is
A local-first Flutter app for organizing household chores and one-time projects, built for personal/couple use on Android. Takes the room-based task scheduling model (inspired by BeTidy), strips cloud/account/social features, and wraps it in a calm, minimal Material 3 UI. Fully offline, free, privacy-respecting — all data stays on-device. A local-first Flutter app for organizing household chores, built for personal/couple use on Android. Uses a room-based task scheduling model where users create rooms, add recurring tasks with frequency intervals, and the app auto-calculates the next due date after each completion. Features a daily plan home screen, bundled German-language task templates, room cleanliness indicators, and daily summary notifications. Fully offline, free, privacy-respecting — all data stays on-device.
## Core Value ## Core Value
Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it. Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it.
## Current Milestone: v1.1 Calendar & Polish
**Goal:** Replace the stacked daily plan with a horizontal calendar strip UI, add task completion history, and task sorting options.
**Target features:**
- Horizontal date-strip calendar with day abbreviation + date number cards
- Month color shift for visual boundary between months
- Day-selection shows tasks in a list below the strip
- Undone tasks carry over to the next day with color accent (overdue marker)
- Task completion history log
- Additional task sorting (alphabetical, interval, effort)
## Requirements ## Requirements
### Validated ### Validated
(None yet — ship to validate) - Room CRUD with icons and drag-and-drop reorder — v1.0
- Task CRUD with frequency intervals and due date calculation — v1.0
- Daily plan view with overdue/today/upcoming sections — v1.0
- Task completion with auto-scheduling of next due date — v1.0
- Bundled task templates per room type (German only, 14 room types) — v1.0
- Daily summary notification with configurable time — v1.0
- Light/dark theme with calm Material 3 palette — v1.0
- Cleanliness indicator per room (based on overdue vs on-time) — v1.0
### Active ### Active
- [ ] Room CRUD with icons and optional photos - [ ] Horizontal calendar strip home screen (replacing stacked daily plan)
- [ ] Task CRUD with frequency intervals and due date calculation - [ ] Overdue task carry-over with visual accent
- [ ] Daily plan view with overdue/today/upcoming sections - [ ] Task completion history log
- [ ] Task completion with auto-scheduling of next due date - [ ] Additional task sorting (alphabetical, interval, effort)
- [ ] Bundled task templates per room type (German only) - [ ] Data export/import (JSON) — deferred
- [ ] Daily summary notification - [ ] English localization — deferred
- [ ] Light/dark theme with calm Material 3 palette - [ ] Room cover photos from camera or gallery — deferred
- [ ] Cleanliness indicator per room (based on overdue vs on-time)
- [ ] Task sorting (due date, alphabetical, interval, effort)
- [ ] Task history (completion log per task)
### Out of Scope ### Out of Scope
@@ -34,8 +50,9 @@ Users can see what needs doing today, mark it done, and trust the app to schedul
- Subscription model / in-app purchases — free forever - Subscription model / in-app purchases — free forever
- Family profile sharing across devices — single-device app - Family profile sharing across devices — single-device app
- Server-side infrastructure — zero backend - Server-side infrastructure — zero backend
- Data export/import (JSON) — deferred to v1.1 - AI-powered task suggestions — overkill for curated templates
- English localization — deferred to v1.1 (ship German-only MVP) - Per-task push notifications — daily summary is more effective
- Firebase or any Google cloud services — contradicts local-first design
- Real-time cross-device sync — potential future self-hosted feature - Real-time cross-device sync — potential future self-hosted feature
- Tablet-optimized layout — future enhancement - Tablet-optimized layout — future enhancement
- Statistics & insights dashboard — v2.0 - Statistics & insights dashboard — v2.0
@@ -44,11 +61,11 @@ Users can see what needs doing today, mark it done, and trust the app to schedul
## Context ## Context
- Inspired by BeTidy (iOS/Android household cleaning app) — taking the proven room-based model, removing cloud/social, refining the UI - Shipped v1.0 MVP with 10,588 LOC Dart (7,773 lib + 2,815 test), 89 tests
- Tech stack: Flutter + Dart, Riverpod 3 + code generation, Drift 2.31 SQLite, GoRouter, flutter_local_notifications
- Inspired by BeTidy (iOS/Android household cleaning app) — room-based model, no cloud/social
- Built for personal use with partner on a shared Android device; may publish publicly later - Built for personal use with partner on a shared Android device; may publish publicly later
- Code and comments in English; UI strings German-only for MVP - Code and comments in English; UI strings German-only for v1.0
- Room photos are nice-to-have for MVP — icon-only rooms are sufficient initially
- Developer is new to Drift (SQLite ORM) — plan should account for learning curve
- Gitea (self-hosted on Hetzner) for version control; no CI/CD pipeline yet - Gitea (self-hosted on Hetzner) for version control; no CI/CD pipeline yet
## Constraints ## Constraints
@@ -57,20 +74,23 @@ Users can see what needs doing today, mark it done, and trust the app to schedul
- **Platform**: Android-first (iOS later) - **Platform**: Android-first (iOS later)
- **Offline**: 100% offline-capable, zero network dependencies - **Offline**: 100% offline-capable, zero network dependencies
- **Privacy**: No data leaves the device, no analytics, no tracking - **Privacy**: No data leaves the device, no analytics, no tracking
- **Language**: German-only UI for MVP, English code/comments - **Language**: German-only UI for v1.0, English code/comments
- **No CI**: No automated build pipeline initially - **No CI**: No automated build pipeline initially
## Key Decisions ## Key Decisions
| Decision | Rationale | Outcome | | Decision | Rationale | Outcome |
|----------|-----------|---------| |----------|-----------|---------|
| Riverpod over Bloc | Modern, compile-safe, less boilerplate, Dart-native | — Pending | | Riverpod 3 over Bloc | Modern, compile-safe, less boilerplate, Dart-native | Good — code generation works well, @riverpod annotation reduces boilerplate |
| Drift over raw sqflite | Type-safe queries, compile-time validation, migration support | — Pending | | Drift over raw sqflite | Type-safe queries, compile-time validation, migration support | Good — DAOs with stream queries provide reactive UI, migration workflow established |
| Android-first | Primary device is Android; iOS follows | — Pending | | Android-first | Primary device is Android; iOS follows | Good — no iOS-specific issues encountered |
| German-only MVP | Primary user language; defer localization infrastructure | — Pending | | German-only MVP | Primary user language; defer localization infrastructure | Good — ARB localization infrastructure in place from Phase 1, ready for English |
| No CI initially | Keep scope focused on the app itself | — Pending | | No CI initially | Keep scope focused on the app itself | Good — manual dart analyze + flutter test sufficient for solo dev |
| Calm Material 3 palette | Muted greens, warm grays, gentle blues — calm productivity, not playful | — Pending | | Calm Material 3 palette | Muted greens, warm grays, gentle blues — calm productivity | Good — sage & stone theme (seed 0xFF7A9A6D) with warm charcoal dark mode |
| Clean Architecture | Feature-based folder structure with data/domain/presentation layers | — Pending | | Clean Architecture | Feature-based folder structure with data/domain/presentation layers | Good — clear separation, easy to navigate |
| Calendar-anchored scheduling | Monthly/quarterly/yearly tasks anchor to original day-of-month with clamping | Good — handles Feb 28/31 edge cases correctly with anchor memory |
| flutter_local_notifications v21 | Standard Flutter notification package, TZ-aware scheduling | Good — inexactAllowWhileIdle avoids SCHEDULE_EXACT_ALARM complexity |
| Manual StreamProvider for drift types | riverpod_generator throws InvalidTypeException with drift Task type | Revisit — may be fixed in future riverpod_generator versions |
--- ---
*Last updated: 2026-03-15 after initialization* *Last updated: 2026-03-16 after v1.1 milestone started*

View File

@@ -1,102 +1,47 @@
# Requirements: HouseHoldKeaper # Requirements: HouseHoldKeaper
**Defined:** 2026-03-15 **Defined:** 2026-03-16
**Core Value:** Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it. **Core Value:** Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it.
## v1 Requirements ## v1.1 Requirements
Requirements for initial release. Each maps to roadmap phases. Requirements for milestone v1.1 Calendar & Polish. Each maps to roadmap phases.
### Room Management ### Calendar UI
- [x] **ROOM-01**: User can create a room with a name and an icon from a curated Material Icons set - [ ] **CAL-01**: User sees a horizontal scrollable date-strip with day abbreviation (Mo, Di...) and date number per card
- [x] **ROOM-02**: User can edit a room's name and icon - [ ] **CAL-02**: User can tap a day card to see that day's tasks in a list below the strip
- [x] **ROOM-03**: User can delete a room with confirmation (cascades to associated tasks) - [ ] **CAL-03**: User sees a subtle color shift at month boundaries for visual orientation
- [x] **ROOM-04**: User can reorder rooms via drag-and-drop on the rooms screen - [ ] **CAL-04**: Calendar strip auto-scrolls to today on app launch
- [x] **ROOM-05**: User can view all rooms as cards showing name, icon, due task count, and cleanliness indicator - [ ] **CAL-05**: Undone tasks carry over to the next day with a red/orange color accent marking them as overdue
### Task Management ### Task History
- [x] **TASK-01**: User can create a task within a room with name, optional description, frequency interval, and effort level - [ ] **HIST-01**: Each task completion is recorded with a timestamp
- [x] **TASK-02**: User can edit a task's name, description, frequency interval, and effort level - [ ] **HIST-02**: User can view past completion dates for any individual task
- [x] **TASK-03**: User can delete a task with confirmation
- [x] **TASK-04**: User can set frequency interval from: daily, every 2 days, every 3 days, weekly, biweekly, monthly, every 2 months, quarterly, every 6 months, yearly, or custom (every N days)
- [x] **TASK-05**: User can set effort level (low / medium / high) on a task
- [x] **TASK-06**: User can sort tasks within a room by due date (default sort order)
- [x] **TASK-07**: User can mark a task as done via tap or swipe, which records a completion timestamp and auto-calculates the next due date based on the interval
- [x] **TASK-08**: Overdue tasks are visually highlighted with distinct color/badge on room cards and in task lists
### Task Templates ### Task Sorting
- [x] **TMPL-01**: When creating a room, user can select from bundled German-language task templates appropriate for that room type - [ ] **SORT-01**: User can sort tasks alphabetically
- [x] **TMPL-02**: Preset room types with templates include: Küche, Badezimmer, Schlafzimmer, Wohnzimmer, Flur, Büro, Garage, Balkon, Waschküche, Keller, Kinderzimmer, Gästezimmer, Esszimmer, Garten/Außenbereich - [ ] **SORT-02**: User can sort tasks by frequency interval
- [ ] **SORT-03**: User can sort tasks by effort level
### Daily Plan ## Future Requirements
- [x] **PLAN-01**: User sees all tasks due today grouped by room on the daily plan screen (primary/default screen)
- [x] **PLAN-02**: Overdue tasks appear in a separate highlighted section at the top of the daily plan
- [x] **PLAN-03**: User can preview upcoming tasks (tomorrow / this week)
- [x] **PLAN-04**: User can swipe-to-complete or tap checkbox to mark tasks done directly from the daily plan view
- [x] **PLAN-05**: User sees a progress indicator showing completed vs total tasks for today (e.g. "5 of 12 tasks done")
- [x] **PLAN-06**: When no tasks are due, user sees an encouraging "all clear" empty state
### Cleanliness Indicator
- [x] **CLEAN-01**: Each room card displays a cleanliness indicator derived from the ratio of overdue tasks to total tasks in that room
### Notifications
- [x] **NOTF-01**: User receives a daily summary notification showing today's task count at a configurable time
- [x] **NOTF-02**: User can enable/disable notifications in settings
### Theme & UI
- [x] **THEME-01**: App supports light and dark themes, following the system setting by default
- [x] **THEME-02**: App uses a calm Material 3 palette with muted greens, warm grays, and gentle blues
### Foundation
- [x] **FOUND-01**: App uses Drift for local SQLite storage with proper schema migration workflow
- [x] **FOUND-02**: App uses Riverpod 3 for state management with code generation
- [x] **FOUND-03**: App uses localization infrastructure (ARB files + AppLocalizations) with German locale, even though only one language ships in v1
- [x] **FOUND-04**: Bottom navigation with tabs: Home (Daily Plan), Rooms, Settings
## v2 Requirements
Deferred to future release. Tracked but not in current roadmap. Deferred to future release. Tracked but not in current roadmap.
### v1.1 — Near-Term ### Data
- **EXPORT-01**: User can export all data as JSON file - **DATA-01**: User can export all data as JSON
- **EXPORT-02**: User can import data from a JSON file - **DATA-02**: User can import data from JSON backup
- **I18N-01**: App supports English as a second language
- **PHOTO-01**: User can add a cover photo to a room from camera or gallery
- **HIST-01**: User can view a completion history log per task (scrollable timeline of completion dates)
- **SORT-01**: User can sort tasks by alphabetical order, interval length, or effort level (in addition to due date)
### v1.2 — Medium-Term ### Localization
- **PROJ-01**: User can create one-time organization projects with sub-task steps - **LOC-01**: User can switch UI language to English
- **PROJ-02**: User can attach before/after photos to a project
- **PROF-01**: User can create named local profiles for household members
- **PROF-02**: User can assign tasks to one or more profiles
- **PROF-03**: User can enable task rotation (round-robin) for shared recurring tasks
- **PROF-04**: User can filter the daily plan view by profile ("My tasks" vs "All tasks")
- **WIDG-01**: Home screen widget showing today's due tasks and overdue count
- **CAL-01**: User can view a weekly overview with task load per day
- **CAL-02**: User can view a monthly calendar heatmap showing task density
- **VAC-01**: User can pause/freeze all task due dates during vacation and resume on return
### v2.0 — Future ### Rooms
- **STAT-01**: User can view completion rate (% on time this week/month) - **ROOM-01**: User can set a cover photo for a room from camera or gallery
- **STAT-02**: User can view streak of consecutive days with all tasks completed
- **STAT-03**: User can view per-room health scores over time
- **ONBRD-01**: First-launch wizard walks user through creating first room and adding tasks
- **COLOR-01**: User can pick a custom accent color for the app theme
- **SYNC-01**: User can optionally sync data via self-hosted infrastructure
- **TABLET-01**: App provides a tablet-optimized layout with adaptive breakpoints
- **NOTF-03**: Optional evening nudge notification if overdue tasks remain
## Out of Scope ## Out of Scope
@@ -104,14 +49,10 @@ Explicitly excluded. Documented to prevent scope creep.
| Feature | Reason | | Feature | Reason |
|---------|--------| |---------|--------|
| User accounts & cloud sync | Local-only by design — zero backend, zero data leaves device | | Weekly/monthly calendar views | Overcomplicates UI — date strip is sufficient for task app |
| Leaderboards & points ranking | Anti-feature — gamification causes app burnout and embeds unequal labor dynamics | | Drag tasks between days | Not needed — tasks auto-schedule based on frequency |
| Subscription model / in-app purchases | Free forever by design — paywalls are the #2 complaint in chore app reviews | | Calendar sync (Google/Apple) | Contradicts local-first, offline-only design |
| Family profile sharing across devices | Single-device app; cross-device requires cloud infrastructure | | Task statistics/charts | Deferred to v2.0 — history log is the foundation |
| AI-powered task suggestions | Requires network/ML; overkill for personal app with curated templates |
| Per-task push notifications | Causes notification fatigue; daily summary is more effective for habit formation |
| Focus timer / Pomodoro | Not a productivity timer app; out of domain |
| Firebase or any Google cloud services | Contradicts local-first, privacy-first design |
## Traceability ## Traceability
@@ -119,42 +60,22 @@ Which phases cover which requirements. Updated during roadmap creation.
| Requirement | Phase | Status | | Requirement | Phase | Status |
|-------------|-------|--------| |-------------|-------|--------|
| FOUND-01 | Phase 1: Foundation | Complete | | CAL-01 | Phase 5 | Pending |
| FOUND-02 | Phase 1: Foundation | Complete | | CAL-02 | Phase 5 | Pending |
| FOUND-03 | Phase 1: Foundation | Complete | | CAL-03 | Phase 5 | Pending |
| FOUND-04 | Phase 1: Foundation | Complete | | CAL-04 | Phase 5 | Pending |
| THEME-01 | Phase 1: Foundation | Complete | | CAL-05 | Phase 5 | Pending |
| THEME-02 | Phase 1: Foundation | Complete | | HIST-01 | Phase 6 | Pending |
| ROOM-01 | Phase 2: Rooms and Tasks | Complete | | HIST-02 | Phase 6 | Pending |
| ROOM-02 | Phase 2: Rooms and Tasks | Complete | | SORT-01 | Phase 7 | Pending |
| ROOM-03 | Phase 2: Rooms and Tasks | Complete | | SORT-02 | Phase 7 | Pending |
| ROOM-04 | Phase 2: Rooms and Tasks | Complete | | SORT-03 | Phase 7 | Pending |
| ROOM-05 | Phase 2: Rooms and Tasks | Complete |
| TASK-01 | Phase 2: Rooms and Tasks | Complete |
| TASK-02 | Phase 2: Rooms and Tasks | Complete |
| TASK-03 | Phase 2: Rooms and Tasks | Complete |
| TASK-04 | Phase 2: Rooms and Tasks | Complete |
| TASK-05 | Phase 2: Rooms and Tasks | Complete |
| TASK-06 | Phase 2: Rooms and Tasks | Complete |
| TASK-07 | Phase 2: Rooms and Tasks | Complete |
| TASK-08 | Phase 2: Rooms and Tasks | Complete |
| TMPL-01 | Phase 2: Rooms and Tasks | Complete |
| TMPL-02 | Phase 2: Rooms and Tasks | Complete |
| PLAN-01 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-02 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-03 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-04 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-05 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-06 | Phase 3: Daily Plan and Cleanliness | Complete |
| CLEAN-01 | Phase 3: Daily Plan and Cleanliness | Complete |
| NOTF-01 | Phase 4: Notifications | Complete |
| NOTF-02 | Phase 4: Notifications | Complete |
**Coverage:** **Coverage:**
- v1 requirements: 30 total - v1.1 requirements: 10 total
- Mapped to phases: 30 - Mapped to phases: 10
- Unmapped: 0 - Unmapped: 0
--- ---
*Requirements defined: 2026-03-15* *Requirements defined: 2026-03-16*
*Last updated: 2026-03-15 after roadmap creation* *Last updated: 2026-03-16 after roadmap creation (phases 5-7)*

View File

@@ -0,0 +1,65 @@
# Project Retrospective
*A living document updated after each milestone. Lessons feed forward into future planning.*
## Milestone: v1.0 — MVP
**Shipped:** 2026-03-16
**Phases:** 4 | **Plans:** 13
### What Was Built
- Complete room-based household chore app with auto-scheduling task management
- Daily plan home screen with overdue/today/tomorrow sections and progress tracking
- Bundled German task templates for 14 room types
- Daily summary notifications with configurable time and Android permission handling
- 89 tests covering DAOs, scheduling logic, providers, and widget behavior
### What Worked
- Bottom-up phase structure (foundation -> data -> UI -> polish) kept each phase clean with minimal rework
- TDD approach for providers and services caught several issues early (async race conditions, API mismatches)
- Verification gates at the end of Phase 2, 3, and 4 confirmed all requirements before moving on
- Calendar-anchored scheduling with anchor memory was designed right the first time — no rework needed
- ARB localization from Phase 1 meant adding German strings was frictionless throughout
### What Was Inefficient
- riverpod_generator InvalidTypeException with drift Task type required workaround (manual StreamProvider) in 3 separate plans — should have been caught in Phase 1 research
- Some plan specifications referenced outdated API patterns (flutter_local_notifications positional parameters removed in v20+) — research needs to verify exact current API signatures
- Phase 4 plan checkboxes in ROADMAP.md weren't updated to [x] by executor — minor bookkeeping gap
### Patterns Established
- `@Riverpod(keepAlive: true)` AsyncNotifier with SharedPreferences for persistent settings (ThemeNotifier, NotificationSettingsNotifier)
- Manual StreamProvider.family/autoDispose for drift type compatibility
- DailyPlanDao innerJoin pattern for cross-table queries
- ConsumerStatefulWidget for screens with async callbacks requiring `mounted` guards
- Provider override pattern in widget tests for database isolation
### Key Lessons
1. Research phase should verify exact current package API signatures — breaking changes between major versions cause plan deviations
2. Drift + riverpod_generator type incompatibility is a known issue — plan for manual providers from the start when using drift
3. Verification gates add minimal time (~2 min) but catch integration issues — keep them for all phases
4. Progressive disclosure (AnimatedSize) is a clean pattern for conditional settings UI
### Cost Observations
- Model mix: orchestrator on opus, researchers/planners/executors/checkers on sonnet
- Total execution: ~1.3 hours for 13 plans across 4 phases
- Notable: Verification gates averaged 2 min — very efficient for the confidence they provide
---
## Cross-Milestone Trends
### Process Evolution
| Milestone | Phases | Plans | Key Change |
|-----------|--------|-------|------------|
| v1.0 | 4 | 13 | Initial project — established all patterns |
### Cumulative Quality
| Milestone | Tests | Key Metric |
|-----------|-------|------------|
| v1.0 | 89 | dart analyze clean, 0 issues |
### Top Lessons (Verified Across Milestones)
1. (Single milestone — lessons above will be cross-validated as more milestones ship)

View File

@@ -1,100 +1,73 @@
# Roadmap: HouseHoldKeaper # Roadmap: HouseHoldKeaper
## Overview ## Milestones
Four phases build the app bottom-up along its natural dependency chain. Phase 1 lays the technical foundation every subsequent phase relies on. Phase 2 delivers complete room and task management — the core scheduling loop. Phase 3 surfaces that data as the daily plan view (the primary user experience) and adds the cleanliness indicator. Phase 4 adds notifications and completes the v1 feature set. After Phase 3, the app is usable daily. After Phase 4, it is releasable. - **v1.0 MVP** — Phases 1-4 (shipped 2026-03-16)
- **v1.1 Calendar & Polish** — Phases 5-7 (in progress)
## Phases ## Phases
**Phase Numbering:** <details>
- Integer phases (1, 2, 3): Planned milestone work <summary>v1.0 MVP (Phases 1-4) — SHIPPED 2026-03-16</summary>
- Decimal phases (2.1, 2.2): Urgent insertions (marked with INSERTED)
Decimal phases appear between their surrounding integers in numeric order. - [x] Phase 1: Foundation (2/2 plans) — completed 2026-03-15
- [x] Phase 2: Rooms and Tasks (5/5 plans) — completed 2026-03-15
- [x] Phase 3: Daily Plan and Cleanliness (3/3 plans) — completed 2026-03-16
- [x] Phase 4: Notifications (3/3 plans) — completed 2026-03-16
- [x] **Phase 1: Foundation** - Project scaffold, database, state management, theme, and localization infrastructure (completed 2026-03-15) See `milestones/v1.0-ROADMAP.md` for full phase details.
- [x] **Phase 2: Rooms and Tasks** - Complete room CRUD, task CRUD with auto-scheduling, and bundled templates (completed 2026-03-15)
- [x] **Phase 3: Daily Plan and Cleanliness** - Primary daily plan screen with overdue/today/upcoming, cleanliness indicators per room (completed 2026-03-16) </details>
- [x] **Phase 4: Notifications** - Daily summary notification with configurable time and Android permission handling (completed 2026-03-16)
**v1.1 Calendar & Polish (Phases 5-7):**
- [ ] **Phase 5: Calendar Strip** - Replace the stacked daily plan home screen with a horizontal scrollable date-strip and day-task list
- [ ] **Phase 6: Task History** - Record every task completion with a timestamp and expose a per-task history view
- [ ] **Phase 7: Task Sorting** - Add alphabetical, interval, and effort sort options to task lists
## Phase Details ## Phase Details
### Phase 1: Foundation ### Phase 5: Calendar Strip
**Goal**: The app compiles, opens, and enforces correct architecture patterns — ready to receive features without accumulating technical debt **Goal**: Users navigate their tasks through a horizontal date-strip that replaces the stacked daily plan, seeing today's tasks by default and any day's tasks on tap
**Depends on**: Nothing (first phase) **Depends on**: Phase 4 (v1.0 shipped — all data layer and scheduling in place)
**Requirements**: FOUND-01, FOUND-02, FOUND-03, FOUND-04, THEME-01, THEME-02 **Requirements**: CAL-01, CAL-02, CAL-03, CAL-04, CAL-05
**Success Criteria** (what must be TRUE): **Success Criteria** (what must be TRUE):
1. App launches on Android without errors and shows a bottom navigation bar with Home, Rooms, and Settings tabs 1. The home screen shows a horizontal scrollable strip of day cards, each displaying the German day abbreviation (Mo, Di, Mi...) and the date number
2. Light and dark themes work correctly and follow the system setting by default, using the calm Material 3 palette (muted greens, warm grays, gentle blues) 2. Tapping any day card updates the task list below the strip to show that day's tasks, with the selected card visually highlighted
3. All UI strings are loaded from ARB localization files — no hardcoded German text in Dart code 3. On app launch the strip auto-scrolls so today's card is centered and selected by default
4. The Drift database opens on first launch with schemaVersion 1 and the migration workflow is established (drift_dev make-migrations runs without errors) 4. When two adjacent day cards span a month boundary, a subtle color shift or divider makes the boundary visible without extra chrome
5. riverpod_lint is active and flags ref.watch usage outside build() as an analysis error 5. Tasks that were not completed on their due date appear in subsequent days' lists with a red/orange accent marking them as overdue
**Plans**: 2 plans **Plans**: TBD
Plans:
- [x] 01-01-PLAN.md — Scaffold Flutter project and build core infrastructure (database, providers, theme, localization)
- [x] 01-02-PLAN.md — Navigation shell, placeholder screens, Settings, and full app wiring
### Phase 2: Rooms and Tasks ### Phase 6: Task History
**Goal**: Users can create and manage rooms and tasks, mark tasks done, and trust the app to schedule the next occurrence automatically **Goal**: Users can see exactly when each task was completed in the past, building trust that the scheduling loop is working correctly
**Depends on**: Phase 1 **Depends on**: Phase 5
**Requirements**: ROOM-01, ROOM-02, ROOM-03, ROOM-04, ROOM-05, TASK-01, TASK-02, TASK-03, TASK-04, TASK-05, TASK-06, TASK-07, TASK-08, TMPL-01, TMPL-02 **Requirements**: HIST-01, HIST-02
**Success Criteria** (what must be TRUE): **Success Criteria** (what must be TRUE):
1. User can create a room with a name and icon, edit it, reorder rooms via drag-and-drop, and delete it (with confirmation that removes all associated tasks) 1. Every task completion (tap done in any view) is recorded in the database with a precise timestamp — data persists across app restarts
2. User can create a task in a room with name, description, frequency interval (daily through yearly and custom), and effort level; tasks can be edited and deleted with confirmation 2. From a task's detail or context menu the user can open a history view listing all past completion dates for that task in reverse-chronological order
3. When creating a room, user can select from bundled German-language task templates for the chosen room type (all 14 room types covered) and they are added to the room as tasks 3. The history view shows a meaningful empty state if the task has never been completed
4. User can mark a task done (tap or swipe), which records the completion and sets the next due date correctly based on the interval **Plans**: TBD
5. Overdue tasks are visually highlighted with a distinct color or badge on room cards and in task lists; tasks within a room are sorted by due date by default
6. Each room card shows its name, icon, count of due tasks, and cleanliness indicator
**Plans**: 5 plans
Plans:
- [x] 02-01-PLAN.md — Data layer: Drift tables, migration v1->v2, DAOs, scheduling utility, domain models, templates, tests
- [x] 02-02-PLAN.md — Room CRUD UI: 2-column card grid, room form, icon picker, drag-and-drop reorder, providers
- [x] 02-03-PLAN.md — Task CRUD UI: task list, task row with completion, task form, overdue highlighting, providers
- [x] 02-04-PLAN.md — Template selection: template picker bottom sheet, room type detection, integration with room creation
- [x] 02-05-PLAN.md — Visual and functional verification checkpoint
### Phase 3: Daily Plan and Cleanliness ### Phase 7: Task Sorting
**Goal**: Users can open the app and immediately see what needs doing today, act on tasks directly from the plan view, and see a room-level health indicator **Goal**: Users can reorder task lists by the dimension most useful to them — name, how often the task recurs, or how much effort it requires
**Depends on**: Phase 2 **Depends on**: Phase 5
**Requirements**: PLAN-01, PLAN-02, PLAN-03, PLAN-04, PLAN-05, PLAN-06, CLEAN-01 **Requirements**: SORT-01, SORT-02, SORT-03
**Success Criteria** (what must be TRUE): **Success Criteria** (what must be TRUE):
1. The Home tab shows today's tasks grouped by room, with a separate highlighted section at the top for overdue tasks 1. A sort control (dropdown, segmented button, or similar) is visible on task list screens and persists the chosen sort across app restarts
2. User can mark a task done directly from the daily plan view via swipe or checkbox without navigating to the room 2. Selecting alphabetical sort orders tasks A-Z by name within the visible list
3. User can see upcoming tasks (tomorrow and this week) from the daily plan screen 3. Selecting interval sort orders tasks from most-frequent (daily) to least-frequent (yearly/custom) intervals
4. A progress indicator shows completed vs total tasks for today (e.g., "5 von 12 erledigt") 4. Selecting effort sort orders tasks from lowest effort to highest effort level
5. When no tasks are due, an encouraging "all clear" empty state is shown instead of an empty list **Plans**: TBD
6. Each room card displays a cleanliness indicator derived from the ratio of overdue tasks to total tasks in that room
**Plans**: 3 plans
Plans:
- [x] 03-01-PLAN.md — Data layer: DailyPlanDao with cross-room join query, providers, and localization keys
- [x] 03-02-PLAN.md — Daily plan UI: HomeScreen rewrite with progress card, task sections, animated completion, empty state
- [x] 03-03-PLAN.md — Visual and functional verification checkpoint
### Phase 4: Notifications
**Goal**: Users receive a daily summary notification reminding them of today's task count, and can control notification behavior from settings
**Depends on**: Phase 2
**Requirements**: NOTF-01, NOTF-02
**Success Criteria** (what must be TRUE):
1. User receives one daily notification showing the count of tasks due today, scheduled at a configurable time
2. User can enable or disable notifications from the Settings tab, and the change takes effect immediately
3. Notifications are correctly rescheduled after device reboot (RECEIVE_BOOT_COMPLETED receiver active)
4. On Android API 33+, the app requests POST_NOTIFICATIONS permission at the appropriate moment and degrades gracefully if denied
**Plans**: 3 plans
Plans:
- [ ] 04-01-PLAN.md — Infrastructure: packages, Android config, NotificationService, NotificationSettingsNotifier, DAO queries, timezone init, tests
- [ ] 04-02-PLAN.md — Settings UI: Benachrichtigungen section with toggle, time picker, permission flow, scheduling wiring, tests
- [ ] 04-03-PLAN.md — Verification gate: dart analyze + full test suite + requirement confirmation
## Progress ## Progress
**Execution Order:** | Phase | Milestone | Plans Complete | Status | Completed |
Phases execute in numeric order: 1 -> 2 -> 3 -> 4 |-------|-----------|----------------|--------|-----------|
| 1. Foundation | v1.0 | 2/2 | Complete | 2026-03-15 |
Note: Phase 4 depends on Phase 2 (needs scheduling data) but can be developed in parallel with Phase 3. | 2. Rooms and Tasks | v1.0 | 5/5 | Complete | 2026-03-15 |
| 3. Daily Plan and Cleanliness | v1.0 | 3/3 | Complete | 2026-03-16 |
| Phase | Plans Complete | Status | Completed | | 4. Notifications | v1.0 | 3/3 | Complete | 2026-03-16 |
|-------|----------------|--------|-----------| | 5. Calendar Strip | v1.1 | 0/? | Not started | - |
| 1. Foundation | 2/2 | Complete | 2026-03-15 | | 6. Task History | v1.1 | 0/? | Not started | - |
| 2. Rooms and Tasks | 5/5 | Complete | 2026-03-15 | | 7. Task Sorting | v1.1 | 0/? | Not started | - |
| 3. Daily Plan and Cleanliness | 3/3 | Complete | 2026-03-16 |
| 4. Notifications | 3/3 | Complete | 2026-03-16 |

View File

@@ -1,130 +1,71 @@
--- ---
gsd_state_version: 1.0 gsd_state_version: 1.0
milestone: v1.0 milestone: v1.1
milestone_name: milestone milestone_name: Calendar & Polish
status: executing status: ready
stopped_at: Completed 04-03-PLAN.md (Phase 4 Verification Gate) stopped_at: Roadmap created — ready for Phase 5
last_updated: "2026-03-16T14:20:25.850Z" last_updated: "2026-03-16T21:00:00.000Z"
last_activity: 2026-03-16 — Completed 04-01-PLAN.md (Notification infrastructure) last_activity: 2026-03-16 — Roadmap created for v1.1 (phases 5-7)
progress: progress:
total_phases: 4 total_phases: 3
completed_phases: 4 completed_phases: 0
total_plans: 13 total_plans: 0
completed_plans: 13 completed_plans: 0
percent: 100 percent: 0
--- ---
# Project State # Project State
## Project Reference ## Project Reference
See: .planning/PROJECT.md (updated 2026-03-15) See: .planning/PROJECT.md (updated 2026-03-16)
**Core value:** Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it. **Core value:** Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it.
**Current focus:** Phase 4: Notifications (Phase 3 complete) **Current focus:** v1.1 Calendar & Polish — Phase 5: Calendar Strip
## Current Position ## Current Position
Phase: 4 of 4 (Notifications) Phase: 5 — Calendar Strip
Plan: 1 of 2 in current phase -- COMPLETE Plan: Not started
Status: Phase 4 in progress — plan 1 complete, plan 2 (Settings UI) pending Status: Ready to plan Phase 5
Last activity: 2026-03-16 — Completed 04-01-PLAN.md (Notification infrastructure) Last activity: 2026-03-16 — Roadmap for v1.1 written (phases 5-7)
Progress: [██████████] 100% ```
Progress: [ ░░░░░░░░░░░░░░░░░░░░ ] 0% (0/3 phases)
```
## Performance Metrics ## Performance Metrics
**Velocity:** | Metric | v1.0 | v1.1 |
- Total plans completed: 10 |--------|------|------|
- Average duration: 6.1 min | Phases | 4 | 3 planned |
- Total execution time: 1.0 hours | Plans | 13 | TBD |
| LOC (lib) | 7,773 | TBD |
**By Phase:** | Tests | 89 | TBD |
| Phase | Plans | Total | Avg/Plan |
|-------|-------|-------|----------|
| 1 - Foundation | 2 | 15 min | 7.5 min |
| 2 - Rooms and Tasks | 5 | 35 min | 7.0 min |
| 3 - Daily Plan and Cleanliness | 3 | 11 min | 3.7 min |
**Recent Trend:**
- Last 5 plans: 02-04 (3 min), 02-05 (1 min), 03-01 (5 min), 03-02 (4 min), 03-03 (2 min)
- Trend: Verification gates consistently fast (1-2 min)
*Updated after each plan completion*
| Phase 02 P01 | 8 | 2 tasks | 16 files |
| Phase 02 P02 | 11 | 2 tasks | 14 files |
| Phase 02 P03 | 12 | 2 tasks | 8 files |
| Phase 02 P04 | 3 | 2 tasks | 5 files |
| Phase 02 P05 | 1 | 1 task | 0 files |
| Phase 03 P01 | 5 | 2 tasks | 10 files |
| Phase 03 P02 | 4 | 2 tasks | 5 files |
| Phase 03 P03 | 2 | 2 tasks | 0 files |
| Phase 04-notifications P01 | 9 | 2 tasks | 11 files |
| Phase 04-notifications P02 | 5 | 2 tasks | 5 files |
| Phase 04-notifications P03 | 2 | 1 tasks | 0 files |
## Accumulated Context ## Accumulated Context
### Decisions ### Decisions
Decisions are logged in PROJECT.md Key Decisions table. | Decision | Rationale |
Recent decisions affecting current work: |----------|-----------|
| Calendar strip replaces daily plan home screen | v1.1 goal per PROJECT.md — not additive, the stacked overdue/today/upcoming sections are removed |
- [Pre-phase]: Riverpod 3.3 requires Flutter 3.41+ — verify before scaffolding | Phase 5 before Phase 6 and 7 | Calendar strip is the primary UI surface; history and sorting operate within or alongside it |
- [Pre-phase]: All due dates stored as date-only (calendar day), not DateTime — enforce from first migration | Phase 6 and 7 both depend on Phase 5 only | History and sorting are independent of each other — could execute in either order |
- [Pre-phase]: German-only UI for MVP; localization infrastructure (ARB + AppLocalizations) required from Phase 1 even with one locale | HIST-01 and HIST-02 in same phase | Data layer (HIST-01) is only 1-2 DAO additions; grouping with the UI (HIST-02) keeps the phase coherent |
- [Pre-phase]: riverpod_lint must be active before any feature code — catches ref.watch outside build() at analysis time
- [Pre-phase]: drift_dev make-migrations workflow must be established in Phase 1 — recovery cost is data loss
- [01-01]: Pinned drift/drift_dev to 2.31.0 for analyzer ^9.0.0 compatibility with riverpod_generator 4.0.3
- [01-01]: Generated Riverpod 3 provider named themeProvider (not themeNotifierProvider) per new naming convention
- [Phase 01-02]: Used themeProvider (Riverpod 3 naming) instead of themeNotifierProvider referenced in plan
- [02-01]: Scheduling functions are top-level pure functions with DateTime today parameter for testability
- [02-01]: Calendar-anchored intervals use anchorDay nullable field for month-clamping memory
- [02-01]: RoomWithStats computed via asyncMap on watchAllRooms stream, not a custom SQL join
- [02-01]: Templates stored as Dart const map for type safety, not JSON assets
- [02-01]: detectRoomType uses contains-based matching with alias map
- [Phase 02]: Scheduling functions are top-level pure functions with DateTime today parameter for testability
- [Phase 02]: Calendar-anchored intervals use anchorDay nullable field for month-clamping memory
- [Phase 02]: Templates stored as Dart const map for type safety, not JSON assets
- [02-02]: ReorderableBuilder<Widget> with typed onReorder callback for drag-and-drop grid
- [02-02]: Long-press context menu (bottom sheet) for edit/delete on room cards
- [02-02]: Provider override pattern in tests to decouple from database dependency
- [02-03]: tasksInRoomProvider defined as manual StreamProvider.family due to riverpod_generator InvalidTypeException with drift Task type
- [02-03]: Frequency selector uses ChoiceChip Wrap layout for 10 presets plus custom option
- [02-03]: TaskRow uses ListTile with middle-dot separator between relative date and frequency label
- [02-04]: Template picker uses StatefulWidget (not Consumer) receiving data via constructor
- [02-04]: Room creation navigates to /rooms/$roomId (context.go) instead of context.pop to show new room
- [02-04]: Calendar-anchored intervals set anchorDay to today's day-of-month; day-count intervals set null
- [02-05]: Auto-approved verification checkpoint: dart analyze clean, 59/59 tests passing, all Phase 2 code integrated
- [03-01]: DailyPlanDao uses innerJoin (not leftOuterJoin) since tasks always have a room
- [03-01]: watchCompletionsToday uses customSelect with readsFrom for proper stream invalidation
- [03-01]: dailyPlanProvider uses manual StreamProvider.autoDispose (not @riverpod) due to drift Task type issue
- [03-01]: Progress total = remaining overdue + remaining today + completedTodayCount for stable denominator
- [03-02]: Used stream-driven completion with local _completingTaskIds Set for animation instead of AnimatedList
- [03-02]: DailyPlanTaskRow is StatelessWidget (not ConsumerWidget) -- completion callback passed in from parent
- [03-02]: No-tasks empty state uses dailyPlanNoTasks key for clearer daily plan context messaging
- [03-03]: Phase 3 verification gate passed: dart analyze clean, 72/72 tests, all 7 requirements confirmed functional
- [Phase 04-01]: timezone constraint upgraded to ^0.11.0 — flutter_local_notifications v21 requires ^0.11.0, plan specified ^0.9.4
- [Phase 04-01]: flutter_local_notifications v21 uses named parameters in initialize() and zonedSchedule() — positional API removed in v20+
- [Phase 04-01]: Generated Riverpod 3 provider named notificationSettingsProvider (not notificationSettingsNotifierProvider) — consistent with themeProvider naming convention
- [Phase 04-01]: nextInstanceOf exposed as @visibleForTesting public method to enable TZ logic unit testing without native dispatch mocking
- [Phase Phase 04-02]: openNotificationSettings() not available in flutter_local_notifications v21 — simplified to informational SnackBar (no action button)
- [Phase Phase 04-02]: ConsumerStatefulWidget for SettingsScreen — async permission callbacks require mounted guards after every await
- [Phase 04-notifications]: Phase 4 verification gate passed: dart analyze --fatal-infos zero issues, 89/89 tests passing — all NOTF-01 and NOTF-02 requirements confirmed functional
### Pending Todos ### Pending Todos
None yet. None.
### Blockers/Concerns ### Blockers/Concerns
- ~~[Research]: Recurrence policy edge cases not fully specified~~ — **RESOLVED** in 2-CONTEXT.md: calendar-anchored intervals clamp to last day with anchor memory, day-count intervals roll forward. Next due from original due date. Catch-up skips to next future date. - The existing HomeScreen (daily plan with overdue/today/upcoming) will be replaced entirely in Phase 5. Verify no other screen references the daily plan provider before deleting it, or migrate references.
- [Research]: Notification time configuration (user-adjustable vs hardcoded) not resolved. Decide before Phase 4 planning. - CAL-05 (overdue carry-over with color accent) requires a query that returns tasks by their original due date relative to a selected day — confirm the existing DailyPlanDao can be adapted or a new CalendarDao is needed.
- ~~[Research]: First-launch template seeding UX (silent vs prompted) not resolved~~ — **RESOLVED** in 2-CONTEXT.md: post-creation prompt with all templates unchecked. Room type is optional, detected from name. Custom rooms skip templates entirely.
## Session Continuity ## Session Continuity
Last session: 2026-03-16T14:13:32.148Z Last session: 2026-03-16
Stopped at: Completed 04-03-PLAN.md (Phase 4 Verification Gate) Stopped at: Roadmap created, ready for Phase 5 planning
Resume file: None Resume file: None
Next action: `/gsd:plan-phase 5`

View File

@@ -0,0 +1,169 @@
# Requirements Archive: v1.0 MVP
**Archived:** 2026-03-16
**Status:** SHIPPED
For current requirements, see `.planning/REQUIREMENTS.md`.
---
# Requirements: HouseHoldKeaper
**Defined:** 2026-03-15
**Core Value:** Users can see what needs doing today, mark it done, and trust the app to schedule the next occurrence — without thinking about it.
## v1 Requirements
Requirements for initial release. Each maps to roadmap phases.
### Room Management
- [x] **ROOM-01**: User can create a room with a name and an icon from a curated Material Icons set
- [x] **ROOM-02**: User can edit a room's name and icon
- [x] **ROOM-03**: User can delete a room with confirmation (cascades to associated tasks)
- [x] **ROOM-04**: User can reorder rooms via drag-and-drop on the rooms screen
- [x] **ROOM-05**: User can view all rooms as cards showing name, icon, due task count, and cleanliness indicator
### Task Management
- [x] **TASK-01**: User can create a task within a room with name, optional description, frequency interval, and effort level
- [x] **TASK-02**: User can edit a task's name, description, frequency interval, and effort level
- [x] **TASK-03**: User can delete a task with confirmation
- [x] **TASK-04**: User can set frequency interval from: daily, every 2 days, every 3 days, weekly, biweekly, monthly, every 2 months, quarterly, every 6 months, yearly, or custom (every N days)
- [x] **TASK-05**: User can set effort level (low / medium / high) on a task
- [x] **TASK-06**: User can sort tasks within a room by due date (default sort order)
- [x] **TASK-07**: User can mark a task as done via tap or swipe, which records a completion timestamp and auto-calculates the next due date based on the interval
- [x] **TASK-08**: Overdue tasks are visually highlighted with distinct color/badge on room cards and in task lists
### Task Templates
- [x] **TMPL-01**: When creating a room, user can select from bundled German-language task templates appropriate for that room type
- [x] **TMPL-02**: Preset room types with templates include: Küche, Badezimmer, Schlafzimmer, Wohnzimmer, Flur, Büro, Garage, Balkon, Waschküche, Keller, Kinderzimmer, Gästezimmer, Esszimmer, Garten/Außenbereich
### Daily Plan
- [x] **PLAN-01**: User sees all tasks due today grouped by room on the daily plan screen (primary/default screen)
- [x] **PLAN-02**: Overdue tasks appear in a separate highlighted section at the top of the daily plan
- [x] **PLAN-03**: User can preview upcoming tasks (tomorrow / this week)
- [x] **PLAN-04**: User can swipe-to-complete or tap checkbox to mark tasks done directly from the daily plan view
- [x] **PLAN-05**: User sees a progress indicator showing completed vs total tasks for today (e.g. "5 of 12 tasks done")
- [x] **PLAN-06**: When no tasks are due, user sees an encouraging "all clear" empty state
### Cleanliness Indicator
- [x] **CLEAN-01**: Each room card displays a cleanliness indicator derived from the ratio of overdue tasks to total tasks in that room
### Notifications
- [x] **NOTF-01**: User receives a daily summary notification showing today's task count at a configurable time
- [x] **NOTF-02**: User can enable/disable notifications in settings
### Theme & UI
- [x] **THEME-01**: App supports light and dark themes, following the system setting by default
- [x] **THEME-02**: App uses a calm Material 3 palette with muted greens, warm grays, and gentle blues
### Foundation
- [x] **FOUND-01**: App uses Drift for local SQLite storage with proper schema migration workflow
- [x] **FOUND-02**: App uses Riverpod 3 for state management with code generation
- [x] **FOUND-03**: App uses localization infrastructure (ARB files + AppLocalizations) with German locale, even though only one language ships in v1
- [x] **FOUND-04**: Bottom navigation with tabs: Home (Daily Plan), Rooms, Settings
## v2 Requirements
Deferred to future release. Tracked but not in current roadmap.
### v1.1 — Near-Term
- **EXPORT-01**: User can export all data as JSON file
- **EXPORT-02**: User can import data from a JSON file
- **I18N-01**: App supports English as a second language
- **PHOTO-01**: User can add a cover photo to a room from camera or gallery
- **HIST-01**: User can view a completion history log per task (scrollable timeline of completion dates)
- **SORT-01**: User can sort tasks by alphabetical order, interval length, or effort level (in addition to due date)
### v1.2 — Medium-Term
- **PROJ-01**: User can create one-time organization projects with sub-task steps
- **PROJ-02**: User can attach before/after photos to a project
- **PROF-01**: User can create named local profiles for household members
- **PROF-02**: User can assign tasks to one or more profiles
- **PROF-03**: User can enable task rotation (round-robin) for shared recurring tasks
- **PROF-04**: User can filter the daily plan view by profile ("My tasks" vs "All tasks")
- **WIDG-01**: Home screen widget showing today's due tasks and overdue count
- **CAL-01**: User can view a weekly overview with task load per day
- **CAL-02**: User can view a monthly calendar heatmap showing task density
- **VAC-01**: User can pause/freeze all task due dates during vacation and resume on return
### v2.0 — Future
- **STAT-01**: User can view completion rate (% on time this week/month)
- **STAT-02**: User can view streak of consecutive days with all tasks completed
- **STAT-03**: User can view per-room health scores over time
- **ONBRD-01**: First-launch wizard walks user through creating first room and adding tasks
- **COLOR-01**: User can pick a custom accent color for the app theme
- **SYNC-01**: User can optionally sync data via self-hosted infrastructure
- **TABLET-01**: App provides a tablet-optimized layout with adaptive breakpoints
- **NOTF-03**: Optional evening nudge notification if overdue tasks remain
## Out of Scope
Explicitly excluded. Documented to prevent scope creep.
| Feature | Reason |
|---------|--------|
| User accounts & cloud sync | Local-only by design — zero backend, zero data leaves device |
| Leaderboards & points ranking | Anti-feature — gamification causes app burnout and embeds unequal labor dynamics |
| Subscription model / in-app purchases | Free forever by design — paywalls are the #2 complaint in chore app reviews |
| Family profile sharing across devices | Single-device app; cross-device requires cloud infrastructure |
| AI-powered task suggestions | Requires network/ML; overkill for personal app with curated templates |
| Per-task push notifications | Causes notification fatigue; daily summary is more effective for habit formation |
| Focus timer / Pomodoro | Not a productivity timer app; out of domain |
| Firebase or any Google cloud services | Contradicts local-first, privacy-first design |
## Traceability
Which phases cover which requirements. Updated during roadmap creation.
| Requirement | Phase | Status |
|-------------|-------|--------|
| FOUND-01 | Phase 1: Foundation | Complete |
| FOUND-02 | Phase 1: Foundation | Complete |
| FOUND-03 | Phase 1: Foundation | Complete |
| FOUND-04 | Phase 1: Foundation | Complete |
| THEME-01 | Phase 1: Foundation | Complete |
| THEME-02 | Phase 1: Foundation | Complete |
| ROOM-01 | Phase 2: Rooms and Tasks | Complete |
| ROOM-02 | Phase 2: Rooms and Tasks | Complete |
| ROOM-03 | Phase 2: Rooms and Tasks | Complete |
| ROOM-04 | Phase 2: Rooms and Tasks | Complete |
| ROOM-05 | Phase 2: Rooms and Tasks | Complete |
| TASK-01 | Phase 2: Rooms and Tasks | Complete |
| TASK-02 | Phase 2: Rooms and Tasks | Complete |
| TASK-03 | Phase 2: Rooms and Tasks | Complete |
| TASK-04 | Phase 2: Rooms and Tasks | Complete |
| TASK-05 | Phase 2: Rooms and Tasks | Complete |
| TASK-06 | Phase 2: Rooms and Tasks | Complete |
| TASK-07 | Phase 2: Rooms and Tasks | Complete |
| TASK-08 | Phase 2: Rooms and Tasks | Complete |
| TMPL-01 | Phase 2: Rooms and Tasks | Complete |
| TMPL-02 | Phase 2: Rooms and Tasks | Complete |
| PLAN-01 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-02 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-03 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-04 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-05 | Phase 3: Daily Plan and Cleanliness | Complete |
| PLAN-06 | Phase 3: Daily Plan and Cleanliness | Complete |
| CLEAN-01 | Phase 3: Daily Plan and Cleanliness | Complete |
| NOTF-01 | Phase 4: Notifications | Complete |
| NOTF-02 | Phase 4: Notifications | Complete |
**Coverage:**
- v1 requirements: 30 total
- Mapped to phases: 30
- Unmapped: 0
---
*Requirements defined: 2026-03-15*
*Last updated: 2026-03-15 after roadmap creation*

View File

@@ -0,0 +1,100 @@
# Roadmap: HouseHoldKeaper
## Overview
Four phases build the app bottom-up along its natural dependency chain. Phase 1 lays the technical foundation every subsequent phase relies on. Phase 2 delivers complete room and task management — the core scheduling loop. Phase 3 surfaces that data as the daily plan view (the primary user experience) and adds the cleanliness indicator. Phase 4 adds notifications and completes the v1 feature set. After Phase 3, the app is usable daily. After Phase 4, it is releasable.
## Phases
**Phase Numbering:**
- Integer phases (1, 2, 3): Planned milestone work
- Decimal phases (2.1, 2.2): Urgent insertions (marked with INSERTED)
Decimal phases appear between their surrounding integers in numeric order.
- [x] **Phase 1: Foundation** - Project scaffold, database, state management, theme, and localization infrastructure (completed 2026-03-15)
- [x] **Phase 2: Rooms and Tasks** - Complete room CRUD, task CRUD with auto-scheduling, and bundled templates (completed 2026-03-15)
- [x] **Phase 3: Daily Plan and Cleanliness** - Primary daily plan screen with overdue/today/upcoming, cleanliness indicators per room (completed 2026-03-16)
- [x] **Phase 4: Notifications** - Daily summary notification with configurable time and Android permission handling (completed 2026-03-16)
## Phase Details
### Phase 1: Foundation
**Goal**: The app compiles, opens, and enforces correct architecture patterns — ready to receive features without accumulating technical debt
**Depends on**: Nothing (first phase)
**Requirements**: FOUND-01, FOUND-02, FOUND-03, FOUND-04, THEME-01, THEME-02
**Success Criteria** (what must be TRUE):
1. App launches on Android without errors and shows a bottom navigation bar with Home, Rooms, and Settings tabs
2. Light and dark themes work correctly and follow the system setting by default, using the calm Material 3 palette (muted greens, warm grays, gentle blues)
3. All UI strings are loaded from ARB localization files — no hardcoded German text in Dart code
4. The Drift database opens on first launch with schemaVersion 1 and the migration workflow is established (drift_dev make-migrations runs without errors)
5. riverpod_lint is active and flags ref.watch usage outside build() as an analysis error
**Plans**: 2 plans
Plans:
- [x] 01-01-PLAN.md — Scaffold Flutter project and build core infrastructure (database, providers, theme, localization)
- [x] 01-02-PLAN.md — Navigation shell, placeholder screens, Settings, and full app wiring
### Phase 2: Rooms and Tasks
**Goal**: Users can create and manage rooms and tasks, mark tasks done, and trust the app to schedule the next occurrence automatically
**Depends on**: Phase 1
**Requirements**: ROOM-01, ROOM-02, ROOM-03, ROOM-04, ROOM-05, TASK-01, TASK-02, TASK-03, TASK-04, TASK-05, TASK-06, TASK-07, TASK-08, TMPL-01, TMPL-02
**Success Criteria** (what must be TRUE):
1. User can create a room with a name and icon, edit it, reorder rooms via drag-and-drop, and delete it (with confirmation that removes all associated tasks)
2. User can create a task in a room with name, description, frequency interval (daily through yearly and custom), and effort level; tasks can be edited and deleted with confirmation
3. When creating a room, user can select from bundled German-language task templates for the chosen room type (all 14 room types covered) and they are added to the room as tasks
4. User can mark a task done (tap or swipe), which records the completion and sets the next due date correctly based on the interval
5. Overdue tasks are visually highlighted with a distinct color or badge on room cards and in task lists; tasks within a room are sorted by due date by default
6. Each room card shows its name, icon, count of due tasks, and cleanliness indicator
**Plans**: 5 plans
Plans:
- [x] 02-01-PLAN.md — Data layer: Drift tables, migration v1->v2, DAOs, scheduling utility, domain models, templates, tests
- [x] 02-02-PLAN.md — Room CRUD UI: 2-column card grid, room form, icon picker, drag-and-drop reorder, providers
- [x] 02-03-PLAN.md — Task CRUD UI: task list, task row with completion, task form, overdue highlighting, providers
- [x] 02-04-PLAN.md — Template selection: template picker bottom sheet, room type detection, integration with room creation
- [x] 02-05-PLAN.md — Visual and functional verification checkpoint
### Phase 3: Daily Plan and Cleanliness
**Goal**: Users can open the app and immediately see what needs doing today, act on tasks directly from the plan view, and see a room-level health indicator
**Depends on**: Phase 2
**Requirements**: PLAN-01, PLAN-02, PLAN-03, PLAN-04, PLAN-05, PLAN-06, CLEAN-01
**Success Criteria** (what must be TRUE):
1. The Home tab shows today's tasks grouped by room, with a separate highlighted section at the top for overdue tasks
2. User can mark a task done directly from the daily plan view via swipe or checkbox without navigating to the room
3. User can see upcoming tasks (tomorrow and this week) from the daily plan screen
4. A progress indicator shows completed vs total tasks for today (e.g., "5 von 12 erledigt")
5. When no tasks are due, an encouraging "all clear" empty state is shown instead of an empty list
6. Each room card displays a cleanliness indicator derived from the ratio of overdue tasks to total tasks in that room
**Plans**: 3 plans
Plans:
- [x] 03-01-PLAN.md — Data layer: DailyPlanDao with cross-room join query, providers, and localization keys
- [x] 03-02-PLAN.md — Daily plan UI: HomeScreen rewrite with progress card, task sections, animated completion, empty state
- [x] 03-03-PLAN.md — Visual and functional verification checkpoint
### Phase 4: Notifications
**Goal**: Users receive a daily summary notification reminding them of today's task count, and can control notification behavior from settings
**Depends on**: Phase 2
**Requirements**: NOTF-01, NOTF-02
**Success Criteria** (what must be TRUE):
1. User receives one daily notification showing the count of tasks due today, scheduled at a configurable time
2. User can enable or disable notifications from the Settings tab, and the change takes effect immediately
3. Notifications are correctly rescheduled after device reboot (RECEIVE_BOOT_COMPLETED receiver active)
4. On Android API 33+, the app requests POST_NOTIFICATIONS permission at the appropriate moment and degrades gracefully if denied
**Plans**: 3 plans
Plans:
- [ ] 04-01-PLAN.md — Infrastructure: packages, Android config, NotificationService, NotificationSettingsNotifier, DAO queries, timezone init, tests
- [ ] 04-02-PLAN.md — Settings UI: Benachrichtigungen section with toggle, time picker, permission flow, scheduling wiring, tests
- [ ] 04-03-PLAN.md — Verification gate: dart analyze + full test suite + requirement confirmation
## Progress
**Execution Order:**
Phases execute in numeric order: 1 -> 2 -> 3 -> 4
Note: Phase 4 depends on Phase 2 (needs scheduling data) but can be developed in parallel with Phase 3.
| Phase | Plans Complete | Status | Completed |
|-------|----------------|--------|-----------|
| 1. Foundation | 2/2 | Complete | 2026-03-15 |
| 2. Rooms and Tasks | 5/5 | Complete | 2026-03-15 |
| 3. Daily Plan and Cleanliness | 3/3 | Complete | 2026-03-16 |
| 4. Notifications | 3/3 | Complete | 2026-03-16 |

View File

@@ -1,3 +1,6 @@
import java.io.FileInputStream
import java.util.Properties
plugins { plugins {
id("com.android.application") id("com.android.application")
id("kotlin-android") id("kotlin-android")
@@ -31,25 +34,25 @@ android {
versionName = flutter.versionName versionName = flutter.versionName
} }
def keystorePropertiesFile = rootProject.file("key.properties") val keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties() val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) { if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) keystoreProperties.load(FileInputStream(keystorePropertiesFile))
} }
signingConfigs { signingConfigs {
release { create("release") {
keyAlias = keystoreProperties['keyAlias'] keyAlias = keystoreProperties.getProperty("keyAlias")
keyPassword = keystoreProperties['keyPassword'] keyPassword = keystoreProperties.getProperty("keyPassword")
storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storeFile = keystoreProperties.getProperty("storeFile")?.let { file(it) }
storePassword = keystoreProperties['storePassword'] storePassword = keystoreProperties.getProperty("storePassword")
} }
} }
buildTypes { buildTypes {
release { release {
// TODO: Add your own signing config for the release build. // TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works. // Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.release signingConfig = signingConfigs.getByName("release")
} }
} }
} }

View File

@@ -1,4 +1,4 @@
package com.jlmak.household_keeper package de.jeanlucmakiola.household_keeper
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity