# kinncj/ohcanada architecture

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

- Interactive diagram: https://gitdiagram.com/kinncj/ohcanada
- Repository: https://github.com/kinncj/ohcanada

## Overview

TrueNorth is a portrait-first browser game that teaches Canadian citizenship-test material through a side-scrolling journey, with separate Study and Exam modes. The player enters in the browser, plays levels and engages characters or landmarks, and can review lessons or answer practice questions; progress remains in browser storage and can be transferred as a file. The graph preserves the documented learning modes, accessible DOM interface, and game-rendering layer. Some subsystem links are based on README descriptions or module references; unsampled implementation details are not inferred.

Main entry points: [`app/bootstrap/main.ts`](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/main.ts) (Application startup), [`app/bootstrap/journey.ts`](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/journey.ts) (Journey mode), [`app/application/use-cases/study-session.ts`](https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/study-session.ts) (Study and exam sessions), [`app/application/use-cases/save-progress.ts`](https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/save-progress.ts) (Save progress use case)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_composition["App composition"]
  node_bootstrap["Application startup<br/>[main.ts]"]
end

subgraph group_learning["Learning modes"]
  node_journey["Journey mode<br/>[journey.ts]"]
  node_quests["Quest flow<br/>[quest.ts]"]
  node_study["Study mode<br/>[study.ts]"]
  node_exam["Exam mode<br/>[exam.ts]"]
  node_learn["Lesson reading<br/>[learn.ts]"]
  node_questions["Question bank<br/>[question-bank.ts]"]
  node_sessions["Study and exam sessions<br/>[study-session.ts]"]
  node_scheduler["Review scheduling<br/>[schedule-review.ts]"]
  node_engageables["Characters and landmarks<br/>[engageables.ts]"]
  node_dialogue["Verified dialogue"]
end

subgraph group_game["Game and presentation"]
  node_interface["Accessible screens<br/>[shell.ts]"]
  node_copy["English and French copy<br/>[copy.ts]"]
  node_renderer["Phaser game renderer<br/>[level-scene.ts]"]
  node_character["Character rendering"]
  node_rive["Rive character renderer"]
end

subgraph group_content["Content and domain"]
  node_lessoncontent["Lesson passages<br/>[lesson-passages.ts]"]
  node_questioncontent["Question content<br/>[question-bank.ts]"]
end

subgraph group_state["Progress and saves"]
  node_progress["Progress model<br/>[progress.ts]"]
  node_save["Save progress use case<br/>[save-progress.ts]"]
  node_storage[("Browser progress store<br/>[indexed-db.ts]")]
  node_transfer["Save transfer<br/>[save-transfer.ts]"]
end

node_player(("Player"))
node_browser["Browser"]

node_player -->|"plays in"| node_browser
node_browser -.->|"loads app"| node_bootstrap
node_bootstrap -->|"opens store"| node_storage
node_bootstrap -->|"loads progress"| node_save
node_bootstrap -->|"composes mode"| node_journey
node_bootstrap -->|"composes mode"| node_exam
node_player -->|"plays levels"| node_journey
node_journey -.->|"runs levels"| node_renderer
node_player -->|"studies subject"| node_study
node_player -->|"takes practice exam"| node_exam
node_exam -->|"uses exam attempt"| node_sessions
node_study -.->|"runs study session"| node_sessions
node_study -.->|"schedules review"| node_scheduler
node_sessions -.->|"uses questions"| node_questions
node_scheduler -.->|"schedules questions"| node_questions
node_player -->|"uses screens"| node_interface
node_interface -->|"displays text"| node_copy
node_renderer -.->|"renders characters"| node_character
node_renderer -.->|"optional renderer"| node_rive
node_journey -.->|"composes quests"| node_quests
node_quests -->|"resolves targets"| node_engageables
node_quests -.->|"uses verified lines"| node_dialogue
node_player -->|"engages places"| node_engageables
node_player -->|"reads lessons"| node_learn
node_learn -.->|"reads passages"| node_lessoncontent
node_sessions -.->|"uses question bank"| node_questioncontent
node_save -.->|"updates progress"| node_progress
node_save -.->|"persists progress"| node_storage
node_player -->|"exports progress"| node_transfer
node_transfer -.->|"transfers save data"| node_save

click node_bootstrap "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/main.ts"
click node_journey "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/journey.ts"
click node_quests "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/quest.ts"
click node_study "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/study.ts"
click node_exam "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/exam.ts"
click node_learn "https://github.com/kinncj/ohcanada/blob/main/app/application/content/learn.ts"
click node_questions "https://github.com/kinncj/ohcanada/blob/main/app/application/content/question-bank.ts"
click node_sessions "https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/study-session.ts"
click node_scheduler "https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/schedule-review.ts"
click node_interface "https://github.com/kinncj/ohcanada/blob/main/app/ui/shell.ts"
click node_copy "https://github.com/kinncj/ohcanada/blob/main/app/ui/copy.ts"
click node_renderer "https://github.com/kinncj/ohcanada/blob/main/app/adapters/phaser/level-scene.ts"
click node_character "https://github.com/kinncj/ohcanada/blob/main/app/adapters/phaser/sprite-character-renderer.ts"
click node_rive "https://github.com/kinncj/ohcanada/blob/main/app/adapters/rive/character-renderer.ts"
click node_engageables "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/engageables.ts"
click node_dialogue "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/verified-dialogue.ts"
click node_lessoncontent "https://github.com/kinncj/ohcanada/blob/main/app/application/content/lesson-passages.ts"
click node_questioncontent "https://github.com/kinncj/ohcanada/blob/main/app/application/content/question-bank.ts"
click node_progress "https://github.com/kinncj/ohcanada/blob/main/app/domain/entities/progress.ts"
click node_save "https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/save-progress.ts"
click node_storage "https://github.com/kinncj/ohcanada/blob/main/app/adapters/persistence/indexed-db.ts"
click node_transfer "https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/save-transfer.ts"

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_bootstrap,node_browser toneBlue
class node_journey,node_quests,node_study,node_exam,node_learn,node_questions,node_sessions,node_scheduler,node_engageables,node_dialogue toneAmber
class node_interface,node_copy,node_renderer,node_character,node_rive toneMint
class node_lessoncontent,node_questioncontent toneRose
class node_progress,node_save,node_storage,node_transfer,node_player toneIndigo
```

## Components

### App composition

- [Application startup](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/main.ts): `app/bootstrap/main.ts`

### Learning modes

- [Journey mode](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/journey.ts): `app/bootstrap/journey.ts`
- [Quest flow](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/quest.ts): `app/bootstrap/quest.ts`
- [Study mode](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/study.ts): `app/bootstrap/study.ts`
- [Exam mode](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/exam.ts): `app/bootstrap/exam.ts`
- [Lesson reading](https://github.com/kinncj/ohcanada/blob/main/app/application/content/learn.ts): `app/application/content/learn.ts`
- [Question bank](https://github.com/kinncj/ohcanada/blob/main/app/application/content/question-bank.ts): `app/application/content/question-bank.ts`
- [Study and exam sessions](https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/study-session.ts): `app/application/use-cases/study-session.ts`
- [Review scheduling](https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/schedule-review.ts): `app/application/use-cases/schedule-review.ts`
- [Characters and landmarks](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/engageables.ts): `app/bootstrap/engageables.ts`
- [Verified dialogue](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/verified-dialogue.ts): `app/bootstrap/verified-dialogue.ts`

### Game and presentation

- [Accessible screens](https://github.com/kinncj/ohcanada/blob/main/app/ui/shell.ts): `app/ui/shell.ts`
- [English and French copy](https://github.com/kinncj/ohcanada/blob/main/app/ui/copy.ts): `app/ui/copy.ts`
- [Phaser game renderer](https://github.com/kinncj/ohcanada/blob/main/app/adapters/phaser/level-scene.ts): `app/adapters/phaser/level-scene.ts`
- [Character rendering](https://github.com/kinncj/ohcanada/blob/main/app/adapters/phaser/sprite-character-renderer.ts): `app/adapters/phaser/sprite-character-renderer.ts`
- [Rive character renderer](https://github.com/kinncj/ohcanada/blob/main/app/adapters/rive/character-renderer.ts): `app/adapters/rive/character-renderer.ts`

### Content and domain

- [Lesson passages](https://github.com/kinncj/ohcanada/blob/main/app/application/content/lesson-passages.ts): `app/application/content/lesson-passages.ts`
- [Question content](https://github.com/kinncj/ohcanada/blob/main/app/application/content/question-bank.ts): `app/application/content/question-bank.ts`

### Progress and saves

- [Progress model](https://github.com/kinncj/ohcanada/blob/main/app/domain/entities/progress.ts): `app/domain/entities/progress.ts`
- [Save progress use case](https://github.com/kinncj/ohcanada/blob/main/app/application/use-cases/save-progress.ts): `app/application/use-cases/save-progress.ts`
- [Browser progress store](https://github.com/kinncj/ohcanada/blob/main/app/adapters/persistence/indexed-db.ts): `app/adapters/persistence/indexed-db.ts`
- [Save transfer](https://github.com/kinncj/ohcanada/blob/main/app/bootstrap/save-transfer.ts): `app/bootstrap/save-transfer.ts`

### Other components

- **Player**
- **Browser**

## Connections

- Player → Browser: plays in
- Browser → Application startup: loads app
- Application startup → Browser progress store: opens store (evidence: `app/bootstrap/main.ts`)
- Application startup → Save progress use case: loads progress (evidence: `app/bootstrap/main.ts`)
- Application startup → Journey mode: composes mode (evidence: `app/bootstrap/main.ts`)
- Application startup → Exam mode: composes mode (evidence: `app/bootstrap/main.ts`)
- Player → Journey mode: plays levels
- Journey mode → Phaser game renderer: runs levels
- Player → Study mode: studies subject
- Player → Exam mode: takes practice exam
- Exam mode → Study and exam sessions: uses exam attempt (evidence: `app/bootstrap/exam.ts`)
- Study mode → Study and exam sessions: runs study session
- Study mode → Review scheduling: schedules review
- Study and exam sessions → Question bank: uses questions
- Review scheduling → Question bank: schedules questions
- Player → Accessible screens: uses screens
- Accessible screens → English and French copy: displays text
- Phaser game renderer → Character rendering: renders characters
- Phaser game renderer → Rive character renderer: optional renderer
- Journey mode → Quest flow: composes quests
- Quest flow → Characters and landmarks: resolves targets (evidence: `app/bootstrap/quest.ts`)
- Quest flow → Verified dialogue: uses verified lines (evidence: `app/bootstrap/quest.ts`)
- Player → Characters and landmarks: engages places
- Player → Lesson reading: reads lessons
- Lesson reading → Lesson passages: reads passages
- Study and exam sessions → Question content: uses question bank
- Save progress use case → Progress model: updates progress
- Save progress use case → Browser progress store: persists progress
- Player → Save transfer: exports progress
- Save transfer → Save progress use case: transfers save data
