Files
2026-03-18 11:31:53 +01:00

5.2 KiB

KittieMobile — CLAUDE.md

Project Overview

KittieMobile is an ADHD-friendly task manager with a virtual pet companion. Users manage tasks while caring for a pet (dog, cat, or capybara) that reacts to task completion and daily energy levels. The app is offline-first with optional sync to a remote backend.

Tech Stack

  • Frontend: Flutter 3.x (Dart 3.x), targeting iOS and Android
  • State Management: Riverpod 3.x (flutter_riverpod + riverpod_annotation + riverpod_generator)
  • Local Database: Drift 2.x (SQLite, offline-first; mirrors the PostgreSQL schema)
  • Animations: Rive 0.14.x (pet animations via .riv files in assets/animations/)
  • Navigation: go_router 17.x
  • Fonts: Google Fonts (Lexend, Atkinson Hyperlegible)
  • Notifications: flutter_local_notifications 21.x
  • Remote Sync: http package to backend REST API at localhost:8090

Architecture

Feature-first structure with clean separation of concerns:

lib/
  core/
    constants/    # App-wide constants (colors, sizes, durations, energy levels)
    theme/        # ThemeData, color scheme, text styles
    router/       # go_router configuration and route name constants
  data/
    models/       # Drift table definitions and generated data classes
    repositories/ # Data access layer (abstracts Drift + HTTP)
    db/           # Drift database class and migration strategy
  domain/
    entities/     # Pure Dart domain entities (decoupled from DB schema)
    use_cases/    # Business logic (complete task, reset day, sync, etc.)
  pet/            # Pet engine: mood state machine, Rive controller, reward logic
  features/
    tasks/        # Task CRUD, list view, detail/edit screens
      screens/
      widgets/
      providers/
    onboarding/   # First-run flow: name input, pet selection (dog/cat/capybara)
      screens/
      widgets/
      providers/
    zen_mode/     # Distraction-free single-task view
      screens/
      widgets/
      providers/
    daily_reset/  # Morning check-in: energy level selection (1-3)
      screens/
      widgets/
      providers/
  shared/
    widgets/      # Reusable UI components (EnergyBadge, TaskCard, PetDisplay)
    utils/        # Date helpers, formatters, extensions
assets/
  animations/     # .riv pet animation files (per pet type and mood)
  fonts/          # Custom font files (if self-hosted; otherwise use google_fonts)

Ports & Infrastructure

Service Port Notes
Backend REST API localhost:8090 Remote sync target
PostgreSQL 5432 (Docker internal), 5439 (host-mapped) via docker-compose

API base URL: http://localhost:8090/api/v1/

Widget API Patterns

  • Dual-param widgets: shared/widgets/ accept both entity param (e.g. task: TaskEntity?) AND individual raw params — private getters resolve which to use. Keep backward compat when extending.
  • PetType canonical location: domain/entities/pet_type.dart — never redeclare locally.
  • todayTasksProvider is a top-level alias for tasksProvider (no date filter in MVP).
  • Pet identity vs. pet state: petType/petName belong to userProvider; petStateProvider tracks energy/streak/rewards only.

Naming Conventions

  • Files: snake_case.dart
  • Classes: PascalCase
  • Riverpod providers: camelCaseProvider / camelCaseNotifier
  • Drift tables: class PascalCase, column names camelCase (maps to snake_case in DB)
  • Feature structure: each features/X/ dir contains screens/, widgets/, providers/
  • Route names: string constants in core/router/routes.dart
  • Use cases: VerbNounUseCase e.g. CompleteTaskUseCase, ResetDayUseCase

Build Commands

# Install dependencies
flutter pub get

# Generate code (Drift tables + Riverpod providers)
dart run build_runner build --delete-conflicting-outputs

# Watch mode (during development)
dart run build_runner watch --delete-conflicting-outputs

# Run on connected device/emulator
flutter run

# Static analysis
flutter analyze

# Run tests
flutter test

# Check environment
flutter doctor

Database Schema (Drift mirrors PostgreSQL)

Tables:

  • users — device identity, pet selection (dog/cat/capybara), pet name
  • tasks — title, description, energy_level (1-3), status (pending/done/snoozed/someday/archived), deadline, photo_path, sort_order, synced_at, local_id
  • pet_state — energy_today (1-3), streak_days, total_tasks_done, unlocked_items
  • task_completions — completion log for rewards and analytics

Energy levels: 1 = low, 2 = medium, 3 = high

Sync Strategy

  • Drift local SQLite is the source of truth on device
  • synced_at and local_id columns on tasks track sync state
  • data/repositories/sync_repository.dart pushes unsynced tasks to localhost:8090
  • Conflict resolution: last-write-wins on updated_at

Package Versions (as of project init)

  • flutter_riverpod: ^3.0.0 (3.3.1)
  • riverpod_annotation: ^4.0.0 (4.0.2)
  • riverpod_generator: ^4.0.0 (4.0.3)
  • drift: ^2.22.0 (2.32.0)
  • drift_flutter: ^0.2.0 (0.3.0)
  • drift_dev: ^2.22.0 (2.32.0)
  • go_router: ^17.0.0 (17.1.0)
  • rive: ^0.14.0 (0.14.4)
  • google_fonts: ^8.0.0 (8.0.2)
  • flutter_local_notifications: ^21.0.0 (21.0.0)