# getyourwish/performance-tracker architecture

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

- Interactive diagram: https://gitdiagram.com/getyourwish/performance-tracker
- Repository: https://github.com/getyourwish/performance-tracker
- Video tour (about a minute): https://gitdiagram.com/getyourwish/performance-tracker/video

## Overview

Performance Tracker is a local-first Windows and Android app for recording completed work in a portable tracker.json file. The main workflow is to set a data location, add and arrange board tasks, complete a task with difficulty/date/note, score it, then review history. The graph separates shared domain rules, desktop, Android, and file-backed persistence. README capabilities are included where their modules are identifiable; some screen wiring and desktop persistence calls are only partially sampled, so uncertain links are omitted.

Main entry points: [`desktop/src/App.jsx`](https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/App.jsx) (Desktop app), [`mobile/App.jsx`](https://github.com/getyourwish/performance-tracker/blob/main/mobile/App.jsx) (Android app), [`mobile/src/storage/store.js`](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/store.js) (Tracker store), [`packages/core/index.js`](https://github.com/getyourwish/performance-tracker/blob/main/packages/core/index.js) (Core rules)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_shared["Shared domain rules"]
  node_core["Core rules<br/>[index.js]"]
  node_scoring["Completion scoring<br/>[scoring.js]"]
  node_categories["Category rules<br/>[categories.js]"]
  node_schema["Schema and healing<br/>[schema.js]"]
end

subgraph group_desktop["Windows desktop"]
  node_desktopapp["Desktop app<br/>[App.jsx]"]
  node_board["Task board<br/>[Board.jsx]"]
  node_desktopreviews["Reviews<br/>[Reviews.jsx]"]
  node_desktopsettings["Settings<br/>[Settings.jsx]"]
  node_electron["Desktop host<br/>[main.cjs]"]
  node_preload["Desktop bridge<br/>[preload.cjs]"]
  node_setup["Setup screen<br/>[SetupScreen.jsx]"]
end

subgraph group_android["Android companion"]
  node_mobileapp["Android app<br/>[App.jsx]"]
  node_use_tracker["Tracker binding<br/>[useTracker.js]"]
  node_mobileboard["Task board<br/>[BoardScreen.js]"]
  node_mobilereviews["Reviews<br/>[ReviewsScreen.js]"]
  node_mobilesettings["Settings<br/>[SettingsScreen.js]"]
  node_mobile_setup["Setup screen<br/>[SetupScreen.js]"]
end

subgraph group_persistence["Local file data"]
  node_store["Tracker store<br/>[store.js]"]
  node_saf["Folder access<br/>[saf.js]"]
  node_trackerfile[("tracker.json")]
  node_backups["Backup handling<br/>[backups.js]"]
  node_salvage["File recovery<br/>[salvage.js]"]
end

node_user(("User"))
node_syncthing(("Syncthing"))

node_user -->|"uses"| node_desktopapp
node_user -->|"uses"| node_mobileapp
node_desktopapp -->|"shows setup"| node_setup
node_desktopapp -->|"renders"| node_board
node_desktopapp -->|"renders"| node_desktopreviews
node_desktopapp -->|"renders"| node_desktopsettings
node_desktopapp -->|"validates and scores"| node_core
node_desktopapp -->|"requests data"| node_preload
node_preload -->|"dispatches IPC"| node_electron
node_electron -->|"reads and writes"| node_trackerfile
node_electron -->|"opens folder picker"| node_user
node_board -->|"submits actions"| node_desktopapp
node_desktopreviews -->|"calculates review totals"| node_core
node_mobileapp -->|"binds tracker state"| node_use_tracker
node_mobileapp -->|"shows setup"| node_mobile_setup
node_mobileapp -->|"renders"| node_mobileboard
node_mobileapp -->|"renders"| node_mobilereviews
node_mobileapp -->|"renders"| node_mobilesettings
node_mobileapp -->|"updates settings"| node_core
node_use_tracker -->|"creates and refreshes"| node_store
node_use_tracker -->|"requests folder access"| node_saf
node_store -->|"uses adapter"| node_saf
node_store -->|"reads and writes"| node_trackerfile
node_store -->|"validates and defaults"| node_core
node_store -->|"selects backups"| node_backups
node_store -->|"recovers damaged data"| node_salvage
node_syncthing -.->|"syncs file"| node_trackerfile
node_trackerfile -.->|"external changes"| node_store

click node_core "https://github.com/getyourwish/performance-tracker/blob/main/packages/core/index.js"
click node_scoring "https://github.com/getyourwish/performance-tracker/blob/main/packages/core/src/scoring.js"
click node_categories "https://github.com/getyourwish/performance-tracker/blob/main/packages/core/src/categories.js"
click node_schema "https://github.com/getyourwish/performance-tracker/blob/main/packages/core/src/schema.js"
click node_desktopapp "https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/App.jsx"
click node_board "https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/Board.jsx"
click node_desktopreviews "https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/Reviews.jsx"
click node_desktopsettings "https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/Settings.jsx"
click node_electron "https://github.com/getyourwish/performance-tracker/blob/main/desktop/electron/main.cjs"
click node_preload "https://github.com/getyourwish/performance-tracker/blob/main/desktop/electron/preload.cjs"
click node_setup "https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/SetupScreen.jsx"
click node_mobileapp "https://github.com/getyourwish/performance-tracker/blob/main/mobile/App.jsx"
click node_use_tracker "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/hooks/useTracker.js"
click node_mobileboard "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/components/BoardScreen.js"
click node_mobilereviews "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/components/ReviewsScreen.js"
click node_mobilesettings "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/screens/SettingsScreen.js"
click node_mobile_setup "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/screens/SetupScreen.js"
click node_store "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/store.js"
click node_saf "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/saf.js"
click node_backups "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/backups.js"
click node_salvage "https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/salvage.js"

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_core,node_scoring,node_categories,node_schema,node_user toneBlue
class node_desktopapp,node_board,node_desktopreviews,node_desktopsettings,node_electron,node_preload,node_setup toneAmber
class node_mobileapp,node_use_tracker,node_mobileboard,node_mobilereviews,node_mobilesettings,node_mobile_setup toneMint
class node_store,node_saf,node_trackerfile,node_backups,node_salvage toneRose
class node_syncthing toneIndigo
```

## Components

### Shared domain rules

- [Core rules](https://github.com/getyourwish/performance-tracker/blob/main/packages/core/index.js): `packages/core/index.js`
- [Completion scoring](https://github.com/getyourwish/performance-tracker/blob/main/packages/core/src/scoring.js): `packages/core/src/scoring.js`
- [Category rules](https://github.com/getyourwish/performance-tracker/blob/main/packages/core/src/categories.js): `packages/core/src/categories.js`
- [Schema and healing](https://github.com/getyourwish/performance-tracker/blob/main/packages/core/src/schema.js): `packages/core/src/schema.js`

### Windows desktop

- [Desktop app](https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/App.jsx): `desktop/src/App.jsx`
- [Task board](https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/Board.jsx): `desktop/src/components/Board.jsx`
- [Reviews](https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/Reviews.jsx): `desktop/src/components/Reviews.jsx`
- [Settings](https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/Settings.jsx): `desktop/src/components/Settings.jsx`
- [Desktop host](https://github.com/getyourwish/performance-tracker/blob/main/desktop/electron/main.cjs): `desktop/electron/main.cjs`
- [Desktop bridge](https://github.com/getyourwish/performance-tracker/blob/main/desktop/electron/preload.cjs): `desktop/electron/preload.cjs`
- [Setup screen](https://github.com/getyourwish/performance-tracker/blob/main/desktop/src/components/SetupScreen.jsx): `desktop/src/components/SetupScreen.jsx`

### Android companion

- [Android app](https://github.com/getyourwish/performance-tracker/blob/main/mobile/App.jsx): `mobile/App.jsx`
- [Tracker binding](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/hooks/useTracker.js): `mobile/src/hooks/useTracker.js`
- [Task board](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/components/BoardScreen.js): `mobile/src/components/BoardScreen.js`
- [Reviews](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/components/ReviewsScreen.js): `mobile/src/components/ReviewsScreen.js`
- [Settings](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/screens/SettingsScreen.js): `mobile/src/screens/SettingsScreen.js`
- [Setup screen](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/screens/SetupScreen.js): `mobile/src/screens/SetupScreen.js`

### Local file data

- [Tracker store](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/store.js): `mobile/src/storage/store.js`
- [Folder access](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/saf.js): `mobile/src/storage/saf.js`
- **tracker.json**
- [Backup handling](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/backups.js): `mobile/src/storage/backups.js`
- [File recovery](https://github.com/getyourwish/performance-tracker/blob/main/mobile/src/storage/salvage.js): `mobile/src/storage/salvage.js`

### Other components

- **User**
- **Syncthing**

## Connections

- User → Desktop app: uses
- User → Android app: uses
- Desktop app → Setup screen: shows setup
- Desktop app → Task board: renders
- Desktop app → Reviews: renders
- Desktop app → Settings: renders
- Desktop app → Core rules: validates and scores
- Desktop app → Desktop bridge: requests data
- Desktop bridge → Desktop host: dispatches IPC
- Desktop host → tracker.json: reads and writes
- Desktop host → User: opens folder picker
- Task board → Desktop app: submits actions
- Reviews → Core rules: calculates review totals
- Android app → Tracker binding: binds tracker state
- Android app → Setup screen: shows setup
- Android app → Task board: renders
- Android app → Reviews: renders
- Android app → Settings: renders
- Android app → Core rules: updates settings
- Tracker binding → Tracker store: creates and refreshes
- Tracker binding → Folder access: requests folder access
- Tracker store → Folder access: uses adapter
- Tracker store → tracker.json: reads and writes
- Tracker store → Core rules: validates and defaults
- Tracker store → Backup handling: selects backups
- Tracker store → File recovery: recovers damaged data
- Syncthing → tracker.json: syncs file
- tracker.json → Tracker store: external changes
