# christof-glitch/mealplanner architecture

> Architecture diagram of the GitHub repository christof-glitch/mealplanner, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/christof-glitch/mealplanner
- Repository: https://github.com/christof-glitch/mealplanner

## Overview

This repository contains an Android meal-planning MVP foundation. The visible app entry opens a minimal Compose shell; domain modules define weekly-plan eligibility and locking, shopping-list rules and generation, recipe and store-presence boundaries, export fallback, and persistence continuity. The sampled UI does not yet orchestrate those domain flows, so the graph does not imply a complete user-to-result pipeline. Source excerpts establish the entry, lock-rule, adapter-stub, and persistence relationships; other capability links are omitted where their callers were not shown.

Main entry points: [`app/src/main/java/com/mealplanner/adapters/IntegrationStubs.kt`](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/adapters/IntegrationStubs.kt) (Fallback adapters), [`app/src/main/java/com/mealplanner/data/persistence/ContinuityRepository.kt`](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/ContinuityRepository.kt) (Continuity repository), [`app/src/main/java/com/mealplanner/MainActivity.kt`](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/MainActivity.kt) (Android entry), [`app/src/main/java/com/mealplanner/ui/MealPlannerRoot.kt`](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/ui/MealPlannerRoot.kt) (Compose shell)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App shell"]
  node_activity["Android entry<br/>[MainActivity.kt]"]
  node_root["Compose shell<br/>[MealPlannerRoot.kt]"]
  node_ui_state["UI state"]
  node_platform["Platform abstractions"]
  node_diagnostics["Diagnostics<br/>[Diagnostics.kt]"]
end

subgraph group_planning["Planning domain"]
  node_plan_models["Plan models<br/>[PlanModels.kt]"]
  node_eligibility["Weekday eligibility<br/>[Adr006LockRules.kt]"]
  node_lock_service["Plan lock service<br/>[PlanLockService.kt]"]
end

subgraph group_grocery["Grocery and integrations"]
  node_recipe_models["Recipe models<br/>[RecipeModels.kt]"]
  node_recipe_boundary["Recipe source boundary"]
  node_integration_stubs["Fallback adapters"]
  node_presence_boundary["Store presence boundary"]
  node_shopping_rules["Shopping list rules"]
  node_export["Export fallback"]
end

subgraph group_continuity["Local continuity"]
  node_continuity["Continuity repository"]
  node_mappers["Persistence mappers"]
  node_dao[("Room DAO<br/>[MealPlannerDao.kt]")]
  node_database[("Room database")]
end

node_user(("Meal planner user"))

node_user -->|"opens app"| node_activity
node_activity -->|"renders"| node_root
node_root -->|"reads rule text"| node_eligibility
node_lock_service -->|"marks plan stale"| node_eligibility
node_integration_stubs -->|"implements"| node_recipe_boundary
node_integration_stubs -->|"implements"| node_presence_boundary
node_continuity -->|"reads and writes"| node_dao
node_continuity -->|"encodes and decodes"| node_mappers
node_database -->|"provides"| node_dao

click node_activity "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/MainActivity.kt"
click node_root "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/ui/MealPlannerRoot.kt"
click node_ui_state "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/ui/MealPlannerUiState.kt"
click node_plan_models "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/model/PlanModels.kt"
click node_eligibility "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/planning/Adr006LockRules.kt"
click node_lock_service "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/planning/PlanLockService.kt"
click node_recipe_models "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/model/RecipeModels.kt"
click node_recipe_boundary "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/adapters/RecipeSourceBoundary.kt"
click node_integration_stubs "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/adapters/IntegrationStubs.kt"
click node_presence_boundary "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/adapters/PresenceMappingBoundary.kt"
click node_shopping_rules "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/shopping/ShoppingListRules.kt"
click node_export "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/export/ExportFallbackUseCase.kt"
click node_continuity "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/ContinuityRepository.kt"
click node_mappers "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/SimpleContinuityMappers.kt"
click node_dao "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/MealPlannerDao.kt"
click node_database "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/MealPlannerDatabase.kt"
click node_platform "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/platform/PlatformAbstractions.kt"
click node_diagnostics "https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/diagnostics/Diagnostics.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_activity,node_root,node_ui_state,node_platform,node_diagnostics,node_user toneBlue
class node_plan_models,node_eligibility,node_lock_service toneAmber
class node_recipe_models,node_recipe_boundary,node_integration_stubs,node_presence_boundary,node_shopping_rules,node_export toneMint
class node_continuity,node_mappers,node_dao,node_database toneRose
```

## Components

### App shell

- [Android entry](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/MainActivity.kt): `app/src/main/java/com/mealplanner/MainActivity.kt`
- [Compose shell](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/ui/MealPlannerRoot.kt): `app/src/main/java/com/mealplanner/ui/MealPlannerRoot.kt`
- [UI state](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/ui/MealPlannerUiState.kt): `app/src/main/java/com/mealplanner/ui/MealPlannerUiState.kt`
- [Platform abstractions](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/platform/PlatformAbstractions.kt): `app/src/main/java/com/mealplanner/platform/PlatformAbstractions.kt`
- [Diagnostics](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/diagnostics/Diagnostics.kt): `app/src/main/java/com/mealplanner/diagnostics/Diagnostics.kt`

### Planning domain

- [Plan models](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/model/PlanModels.kt): `app/src/main/java/com/mealplanner/domain/model/PlanModels.kt`
- [Weekday eligibility](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/planning/Adr006LockRules.kt): `app/src/main/java/com/mealplanner/domain/planning/Adr006LockRules.kt`
- [Plan lock service](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/planning/PlanLockService.kt): `app/src/main/java/com/mealplanner/domain/planning/PlanLockService.kt`

### Grocery and integrations

- [Recipe models](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/model/RecipeModels.kt): `app/src/main/java/com/mealplanner/domain/model/RecipeModels.kt`
- [Recipe source boundary](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/adapters/RecipeSourceBoundary.kt): `app/src/main/java/com/mealplanner/adapters/RecipeSourceBoundary.kt`
- [Fallback adapters](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/adapters/IntegrationStubs.kt): `app/src/main/java/com/mealplanner/adapters/IntegrationStubs.kt`
- [Store presence boundary](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/adapters/PresenceMappingBoundary.kt): `app/src/main/java/com/mealplanner/adapters/PresenceMappingBoundary.kt`
- [Shopping list rules](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/shopping/ShoppingListRules.kt): `app/src/main/java/com/mealplanner/domain/shopping/ShoppingListRules.kt`
- [Export fallback](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/domain/export/ExportFallbackUseCase.kt): `app/src/main/java/com/mealplanner/domain/export/ExportFallbackUseCase.kt`

### Local continuity

- [Continuity repository](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/ContinuityRepository.kt): `app/src/main/java/com/mealplanner/data/persistence/ContinuityRepository.kt`
- [Persistence mappers](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/SimpleContinuityMappers.kt): `app/src/main/java/com/mealplanner/data/persistence/SimpleContinuityMappers.kt`
- [Room DAO](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/MealPlannerDao.kt): `app/src/main/java/com/mealplanner/data/persistence/MealPlannerDao.kt`
- [Room database](https://github.com/christof-glitch/mealplanner/blob/main/app/src/main/java/com/mealplanner/data/persistence/MealPlannerDatabase.kt): `app/src/main/java/com/mealplanner/data/persistence/MealPlannerDatabase.kt`

### Other components

- **Meal planner user**

## Connections

- Meal planner user → Android entry: opens app (evidence: `app/src/main/java/com/mealplanner/MainActivity.kt`)
- Android entry → Compose shell: renders (evidence: `app/src/main/java/com/mealplanner/MainActivity.kt`)
- Compose shell → Weekday eligibility: reads rule text (evidence: `app/src/main/java/com/mealplanner/ui/MealPlannerRoot.kt`)
- Plan lock service → Weekday eligibility: marks plan stale (evidence: `app/src/main/java/com/mealplanner/domain/planning/PlanLockService.kt`)
- Fallback adapters → Recipe source boundary: implements (evidence: `app/src/main/java/com/mealplanner/adapters/IntegrationStubs.kt`)
- Fallback adapters → Store presence boundary: implements (evidence: `app/src/main/java/com/mealplanner/adapters/IntegrationStubs.kt`)
- Continuity repository → Room DAO: reads and writes (evidence: `app/src/main/java/com/mealplanner/data/persistence/ContinuityRepository.kt`)
- Continuity repository → Persistence mappers: encodes and decodes (evidence: `app/src/main/java/com/mealplanner/data/persistence/ContinuityRepository.kt`)
- Room database → Room DAO: provides (evidence: `app/src/main/java/com/mealplanner/data/persistence/MealPlannerDatabase.kt`)
