# maximejolivet/pomodoro-accessibility architecture

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

- Interactive diagram: https://gitdiagram.com/maximejolivet/pomodoro-accessibility
- Repository: https://github.com/maximejolivet/pomodoro-accessibility

## Overview

Pomodoro Accessibilité is a visual timer for neurodivergent users, available as an Angular/Capacitor app. The main workflow is to choose a timer mode or routine, control a countdown, receive milestone and completion cues, and review focus history and goals. The session service coordinates timer state and session progression; supporting layers provide persistence, preferences, localization, and device alerts. The README documents accessibility options and native-platform support. Some UI wiring and widget behavior are not shown in the sampled source, so uncertain connections are omitted.

Main entry points: [`src/app/core/services/session.service.ts`](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/session.service.ts) (Session coordinator), [`src/app/features/timer/timer-page.component.ts`](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/timer-page.component.ts) (Timer page), [`src/app/features/timer/sheet/settings-sheet.component.ts`](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/settings-sheet.component.ts) (Settings sheet), [`src/app/app.component.ts`](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/app.component.ts) (App shell)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App shell"]
  node_shell["App shell<br/>[app.component.ts]"]
  node_routes["App routes<br/>[app.routes.ts]"]
  node_accessibility["Accessibility page"]
end

subgraph group_timer["Timer workflow"]
  node_timerpage["Timer page"]
  node_dial["Timer dial"]
  node_controls["Timer controls"]
  node_settings["Settings sheet"]
  node_modes["Mode settings"]
  node_routinesui["Routine panel"]
  node_statsui["Stats panel"]
  node_session["Session coordinator<br/>[session.service.ts]"]
  node_timerstate["Countdown engine<br/>[timer.service.ts]"]
  node_presets["Timer modes<br/>[preset.service.ts]"]
  node_routines["Routine data<br/>[routine.service.ts]"]
end

subgraph group_support["Preferences and support"]
  node_history["History and goals<br/>[history.service.ts]"]
  node_prefs["Preferences"]
  node_storage["Local storage helper<br/>[storage.ts]"]
  node_i18n["Localization<br/>[i18n.service.ts]"]
end

subgraph group_native["Native integrations"]
  node_notifications["Local notifications"]
  node_sound["Sound cues<br/>[sound.service.ts]"]
  node_haptics["Haptic cues<br/>[haptics.service.ts]"]
  node_speech["Spoken cues<br/>[speech.service.ts]"]
  node_widgetservice["Widget service<br/>[widget.service.ts]"]
  node_iosbridge["iOS widget bridge"]
  node_ioswidget["Pomodoro widget"]
end

node_user(("Timer user"))
node_device(("Device platform"))
node_localstore[("Browser storage")]

node_user -->|"opens"| node_shell
node_shell -->|"hosts routes"| node_routes
node_routes -->|"loads"| node_timerpage
node_routes -->|"loads"| node_accessibility
node_user -->|"uses"| node_timerpage
node_timerpage -->|"controls"| node_session
node_timerpage -->|"renders"| node_dial
node_timerpage -->|"renders"| node_controls
node_timerpage -->|"opens"| node_settings
node_settings -->|"shows"| node_modes
node_settings -->|"shows"| node_routinesui
node_settings -->|"shows"| node_statsui
node_session -->|"controls"| node_timerstate
node_session -->|"records sessions"| node_history
node_session -->|"selects modes"| node_presets
node_session -->|"loads routines"| node_routines
node_session -->|"reads settings"| node_prefs
node_session -->|"schedules alerts"| node_notifications
node_session -->|"plays cues"| node_sound
node_session -->|"plays cues"| node_haptics
node_session -->|"announces states"| node_speech
node_history -->|"persists history"| node_storage
node_prefs -->|"persists settings"| node_storage
node_i18n -->|"reads language"| node_storage
node_shell -->|"applies theme"| node_prefs
node_session -->|"gets messages"| node_i18n
node_notifications -.->|"uses native alerts"| node_device
node_sound -.->|"uses audio"| node_device
node_haptics -.->|"uses vibration"| node_device
node_speech -.->|"uses speech"| node_device
node_iosbridge -.->|"bridges widget"| node_ioswidget

click node_shell "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/app.component.ts"
click node_routes "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/app.routes.ts"
click node_timerpage "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/timer-page.component.ts"
click node_dial "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/dial/timer-dial.component.ts"
click node_controls "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/controls/timer-controls.component.ts"
click node_settings "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/settings-sheet.component.ts"
click node_modes "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/modes-tab.component.ts"
click node_routinesui "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/routines-panel.component.ts"
click node_statsui "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/stats-tab.component.ts"
click node_accessibility "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/accessibility/accessibility-page.component.ts"
click node_session "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/session.service.ts"
click node_timerstate "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/timer.service.ts"
click node_presets "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/preset.service.ts"
click node_routines "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/routine.service.ts"
click node_history "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/history.service.ts"
click node_prefs "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/preferences.service.ts"
click node_storage "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/helpers/storage.ts"
click node_i18n "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/i18n/i18n.service.ts"
click node_notifications "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/notification.service.ts"
click node_sound "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/sound.service.ts"
click node_haptics "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/haptics.service.ts"
click node_speech "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/speech.service.ts"
click node_widgetservice "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/widget.service.ts"
click node_iosbridge "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/ios/App/App/WidgetBridgePlugin.swift"
click node_ioswidget "https://github.com/maximejolivet/pomodoro-accessibility/blob/main/ios/App/PomodoroWidget/PomodoroWidget.swift"

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_shell,node_routes,node_accessibility,node_user toneBlue
class node_timerpage,node_dial,node_controls,node_settings,node_modes,node_routinesui,node_statsui,node_session,node_timerstate,node_presets,node_routines,node_localstore toneAmber
class node_history,node_prefs,node_storage,node_i18n toneMint
class node_notifications,node_sound,node_haptics,node_speech,node_widgetservice,node_iosbridge,node_ioswidget toneRose
class node_device toneIndigo
```

## Components

### App shell

- [App shell](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/app.component.ts): `src/app/app.component.ts`
- [App routes](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/app.routes.ts): `src/app/app.routes.ts`
- [Accessibility page](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/accessibility/accessibility-page.component.ts): `src/app/features/accessibility/accessibility-page.component.ts`

### Timer workflow

- [Timer page](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/timer-page.component.ts): `src/app/features/timer/timer-page.component.ts`
- [Timer dial](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/dial/timer-dial.component.ts): `src/app/features/timer/dial/timer-dial.component.ts`
- [Timer controls](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/controls/timer-controls.component.ts): `src/app/features/timer/controls/timer-controls.component.ts`
- [Settings sheet](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/settings-sheet.component.ts): `src/app/features/timer/sheet/settings-sheet.component.ts`
- [Mode settings](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/modes-tab.component.ts): `src/app/features/timer/sheet/modes-tab.component.ts`
- [Routine panel](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/routines-panel.component.ts): `src/app/features/timer/sheet/routines-panel.component.ts`
- [Stats panel](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/features/timer/sheet/stats-tab.component.ts): `src/app/features/timer/sheet/stats-tab.component.ts`
- [Session coordinator](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/session.service.ts): `src/app/core/services/session.service.ts`
- [Countdown engine](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/timer.service.ts): `src/app/core/services/timer.service.ts`
- [Timer modes](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/preset.service.ts): `src/app/core/services/preset.service.ts`
- [Routine data](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/routine.service.ts): `src/app/core/services/routine.service.ts`

### Preferences and support

- [History and goals](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/history.service.ts): `src/app/core/services/history.service.ts`
- [Preferences](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/preferences.service.ts): `src/app/core/services/preferences.service.ts`
- [Local storage helper](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/helpers/storage.ts): `src/app/core/helpers/storage.ts`
- [Localization](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/i18n/i18n.service.ts): `src/app/core/i18n/i18n.service.ts`

### Native integrations

- [Local notifications](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/notification.service.ts): `src/app/core/services/notification.service.ts`
- [Sound cues](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/sound.service.ts): `src/app/core/services/sound.service.ts`
- [Haptic cues](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/haptics.service.ts): `src/app/core/services/haptics.service.ts`
- [Spoken cues](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/speech.service.ts): `src/app/core/services/speech.service.ts`
- [Widget service](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/src/app/core/services/widget.service.ts): `src/app/core/services/widget.service.ts`
- [iOS widget bridge](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/ios/App/App/WidgetBridgePlugin.swift): `ios/App/App/WidgetBridgePlugin.swift`
- [Pomodoro widget](https://github.com/maximejolivet/pomodoro-accessibility/blob/main/ios/App/PomodoroWidget/PomodoroWidget.swift): `ios/App/PomodoroWidget/PomodoroWidget.swift`

### Other components

- **Timer user**
- **Device platform**
- **Browser storage**

## Connections

- Timer user → App shell: opens
- App shell → App routes: hosts routes
- App routes → Timer page: loads
- App routes → Accessibility page: loads
- Timer user → Timer page: uses
- Timer page → Session coordinator: controls
- Timer page → Timer dial: renders
- Timer page → Timer controls: renders
- Timer page → Settings sheet: opens
- Settings sheet → Mode settings: shows
- Settings sheet → Routine panel: shows
- Settings sheet → Stats panel: shows
- Session coordinator → Countdown engine: controls
- Session coordinator → History and goals: records sessions
- Session coordinator → Timer modes: selects modes
- Session coordinator → Routine data: loads routines
- Session coordinator → Preferences: reads settings
- Session coordinator → Local notifications: schedules alerts
- Session coordinator → Sound cues: plays cues
- Session coordinator → Haptic cues: plays cues
- Session coordinator → Spoken cues: announces states
- History and goals → Local storage helper: persists history
- Preferences → Local storage helper: persists settings
- Localization → Local storage helper: reads language
- App shell → Preferences: applies theme
- Session coordinator → Localization: gets messages
- Local notifications → Device platform: uses native alerts
- Sound cues → Device platform: uses audio
- Haptic cues → Device platform: uses vibration
- Spoken cues → Device platform: uses speech
- iOS widget bridge → Pomodoro widget: bridges widget
