# gustavocasaroti/bpmn-academy architecture

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

- Interactive diagram: https://gitdiagram.com/gustavocasaroti/bpmn-academy
- Repository: https://github.com/gustavocasaroti/bpmn-academy

## Overview

BPMN Academy is a browser-based learning platform for understanding and practicing BPMN 2.0; progress is stored locally rather than on a server. Learners browse lessons, symbols, and annotated examples, then practice through laboratory challenges or quizzes; the app records progress, XP, and achievements. The graph preserves the documented content branches and the sampled rendering, validation, simulation, and progress layers. Some feature links rely on README descriptions or source-index references; unsampled implementation details are not inferred.

Main entry points: [`lib/store.tsx`](https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/store.tsx) (Progress store), [`app/(app)/laboratorio/[challengeId]/page.tsx`](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/laboratorio/%5BchallengeId%5D/page.tsx) (Challenge session), [`components/bpmn/DiagramView.tsx`](https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/bpmn/DiagramView.tsx) (Diagram renderer), [`app/(app)/trilha/[moduleId]/page.tsx`](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/trilha/%5BmoduleId%5D/page.tsx) (Lesson view)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_learning["Learning path"]
  node_landing["Get started<br/>[page.tsx]"]
  node_dashboard["Dashboard<br/>[page.tsx]"]
  node_modules["Learning modules<br/>[modules.ts]"]
  node_module_detail["Lesson view<br/>[page.tsx]"]
end

subgraph group_reference["BPMN reference"]
  node_symbols_page["Symbol library<br/>[page.tsx]"]
  node_symbols_data["BPMN symbols<br/>[symbols.ts]"]
  node_examples_page["Process examples<br/>[page.tsx]"]
  node_example_detail["Example detail<br/>[page.tsx]"]
  node_examples_data["Example content<br/>[examples.ts]"]
end

subgraph group_practice["Practice and assessment"]
  node_laboratory["Challenge list<br/>[page.tsx]"]
  node_challenge_view["Challenge session<br/>[page.tsx]"]
  node_challenge_data["Challenge content<br/>[challenges.ts]"]
  node_validation["Diagram validation<br/>[validate.ts]"]
  node_simulation["Process simulation<br/>[simulation.ts]"]
  node_quiz_page["Quiz page<br/>[page.tsx]"]
  node_quiz_runner["Quiz runner<br/>[QuizRunner.tsx]"]
  node_quiz_data["Quiz questions<br/>[quiz.ts]"]
end

subgraph group_progress["Progress and state"]
  node_achievements["Achievements<br/>[page.tsx]"]
  node_progress_rules["Progress rules<br/>[progress.ts]"]
  node_progress_store[("Progress store<br/>[store.tsx]")]
end

subgraph group_shared["Shared interface"]
  node_diagram_view["Diagram renderer<br/>[DiagramView.tsx]"]
  node_glyph["BPMN glyphs<br/>[BpmnGlyph.tsx]"]
  node_content_blocks["Lesson content blocks<br/>[ContentBlocks.tsx]"]
  node_app_shell["App shell<br/>[AppShell.tsx]"]
  node_config["Navigation and modes<br/>[config.ts]"]
end

node_learner(("Learner"))

node_learner -->|"starts at"| node_landing
node_learner -->|"opens"| node_dashboard
node_dashboard -->|"reads progress"| node_progress_store
node_dashboard -->|"summarizes"| node_modules
node_module_detail -->|"loads lessons"| node_modules
node_module_detail -->|"renders content"| node_content_blocks
node_module_detail -->|"updates progress"| node_progress_store
node_symbols_page -->|"browses"| node_symbols_data
node_examples_page -->|"lists examples"| node_examples_data
node_example_detail -->|"loads example"| node_examples_data
node_example_detail -->|"renders diagram"| node_diagram_view
node_example_detail -->|"simulates example"| node_simulation
node_laboratory -->|"lists challenges"| node_challenge_data
node_challenge_view -->|"loads challenge"| node_challenge_data
node_challenge_view -->|"validates diagram"| node_validation
node_challenge_view -->|"runs simulation"| node_simulation
node_challenge_view -->|"renders diagram"| node_diagram_view
node_challenge_view -->|"records completion"| node_progress_store
node_quiz_page -->|"starts quiz"| node_quiz_runner
node_quiz_runner -->|"selects questions"| node_quiz_data
node_quiz_runner -->|"records results"| node_progress_store
node_achievements -->|"reads progress"| node_progress_store
node_achievements -->|"shows achievements"| node_progress_rules
node_progress_store -->|"evaluates achievements"| node_progress_rules
node_progress_store -->|"persists locally"| node_learner
node_diagram_view -->|"renders nodes"| node_glyph
node_content_blocks -->|"renders diagrams"| node_diagram_view
node_app_shell -->|"uses navigation"| node_config

click node_landing "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/page.tsx"
click node_dashboard "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/dashboard/page.tsx"
click node_modules "https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/modules.ts"
click node_module_detail "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/trilha/%5BmoduleId%5D/page.tsx"
click node_symbols_page "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/simbolos/page.tsx"
click node_symbols_data "https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/symbols.ts"
click node_examples_page "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/exemplos/page.tsx"
click node_example_detail "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/exemplos/%5Bid%5D/page.tsx"
click node_examples_data "https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/examples.ts"
click node_laboratory "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/laboratorio/page.tsx"
click node_challenge_view "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/laboratorio/%5BchallengeId%5D/page.tsx"
click node_challenge_data "https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/challenges.ts"
click node_validation "https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/validate.ts"
click node_simulation "https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/simulation.ts"
click node_quiz_page "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/quiz/page.tsx"
click node_quiz_runner "https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/quiz/QuizRunner.tsx"
click node_quiz_data "https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/quiz.ts"
click node_achievements "https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/conquistas/page.tsx"
click node_progress_rules "https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/progress.ts"
click node_progress_store "https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/store.tsx"
click node_diagram_view "https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/bpmn/DiagramView.tsx"
click node_glyph "https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/bpmn/BpmnGlyph.tsx"
click node_content_blocks "https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/dashboard/ContentBlocks.tsx"
click node_app_shell "https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/layout/AppShell.tsx"
click node_config "https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/config.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_landing,node_dashboard,node_modules,node_module_detail toneBlue
class node_symbols_page,node_symbols_data,node_examples_page,node_example_detail,node_examples_data toneAmber
class node_laboratory,node_challenge_view,node_challenge_data,node_validation,node_simulation,node_quiz_page,node_quiz_runner,node_quiz_data toneMint
class node_achievements,node_progress_rules,node_progress_store toneRose
class node_diagram_view,node_glyph,node_content_blocks,node_app_shell,node_config,node_learner toneIndigo
```

## Components

### Learning path

- [Get started](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/page.tsx): `app/page.tsx`
- [Dashboard](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/dashboard/page.tsx): `app/(app)/dashboard/page.tsx`
- [Learning modules](https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/modules.ts): `data/modules.ts`
- [Lesson view](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/trilha/%5BmoduleId%5D/page.tsx): `app/(app)/trilha/[moduleId]/page.tsx`

### BPMN reference

- [Symbol library](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/simbolos/page.tsx): `app/(app)/simbolos/page.tsx`
- [BPMN symbols](https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/symbols.ts): `data/symbols.ts`
- [Process examples](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/exemplos/page.tsx): `app/(app)/exemplos/page.tsx`
- [Example detail](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/exemplos/%5Bid%5D/page.tsx): `app/(app)/exemplos/[id]/page.tsx`
- [Example content](https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/examples.ts): `data/examples.ts`

### Practice and assessment

- [Challenge list](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/laboratorio/page.tsx): `app/(app)/laboratorio/page.tsx`
- [Challenge session](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/laboratorio/%5BchallengeId%5D/page.tsx): `app/(app)/laboratorio/[challengeId]/page.tsx`
- [Challenge content](https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/challenges.ts): `data/challenges.ts`
- [Diagram validation](https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/validate.ts): `lib/validate.ts`
- [Process simulation](https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/simulation.ts): `lib/simulation.ts`
- [Quiz page](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/quiz/page.tsx): `app/(app)/quiz/page.tsx`
- [Quiz runner](https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/quiz/QuizRunner.tsx): `components/quiz/QuizRunner.tsx`
- [Quiz questions](https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/quiz.ts): `data/quiz.ts`

### Progress and state

- [Achievements](https://github.com/gustavocasaroti/bpmn-academy/blob/main/app/(app)/conquistas/page.tsx): `app/(app)/conquistas/page.tsx`
- [Progress rules](https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/progress.ts): `lib/progress.ts`
- [Progress store](https://github.com/gustavocasaroti/bpmn-academy/blob/main/lib/store.tsx): `lib/store.tsx`

### Shared interface

- [Diagram renderer](https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/bpmn/DiagramView.tsx): `components/bpmn/DiagramView.tsx`
- [BPMN glyphs](https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/bpmn/BpmnGlyph.tsx): `components/bpmn/BpmnGlyph.tsx`
- [Lesson content blocks](https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/dashboard/ContentBlocks.tsx): `components/dashboard/ContentBlocks.tsx`
- [App shell](https://github.com/gustavocasaroti/bpmn-academy/blob/main/components/layout/AppShell.tsx): `components/layout/AppShell.tsx`
- [Navigation and modes](https://github.com/gustavocasaroti/bpmn-academy/blob/main/data/config.ts): `data/config.ts`

### Other components

- **Learner**

## Connections

- Learner → Get started: starts at
- Learner → Dashboard: opens
- Dashboard → Progress store: reads progress (evidence: `app/(app)/dashboard/page.tsx`)
- Dashboard → Learning modules: summarizes (evidence: `app/(app)/dashboard/page.tsx`)
- Lesson view → Learning modules: loads lessons (evidence: `app/(app)/trilha/[moduleId]/page.tsx`)
- Lesson view → Lesson content blocks: renders content (evidence: `app/(app)/trilha/[moduleId]/page.tsx`)
- Lesson view → Progress store: updates progress (evidence: `app/(app)/trilha/[moduleId]/page.tsx`)
- Symbol library → BPMN symbols: browses (evidence: `app/(app)/simbolos/page.tsx`)
- Process examples → Example content: lists examples (evidence: `app/(app)/exemplos/page.tsx`)
- Example detail → Example content: loads example (evidence: `app/(app)/exemplos/[id]/page.tsx`)
- Example detail → Diagram renderer: renders diagram (evidence: `app/(app)/exemplos/[id]/page.tsx`)
- Example detail → Process simulation: simulates example (evidence: `app/(app)/exemplos/[id]/page.tsx`)
- Challenge list → Challenge content: lists challenges (evidence: `app/(app)/laboratorio/page.tsx`)
- Challenge session → Challenge content: loads challenge (evidence: `app/(app)/laboratorio/[challengeId]/page.tsx`)
- Challenge session → Diagram validation: validates diagram (evidence: `app/(app)/laboratorio/[challengeId]/page.tsx`)
- Challenge session → Process simulation: runs simulation (evidence: `app/(app)/laboratorio/[challengeId]/page.tsx`)
- Challenge session → Diagram renderer: renders diagram (evidence: `app/(app)/laboratorio/[challengeId]/page.tsx`)
- Challenge session → Progress store: records completion (evidence: `app/(app)/laboratorio/[challengeId]/page.tsx`)
- Quiz page → Quiz runner: starts quiz (evidence: `app/(app)/quiz/page.tsx`)
- Quiz runner → Quiz questions: selects questions (evidence: `components/quiz/QuizRunner.tsx`)
- Quiz runner → Progress store: records results (evidence: `components/quiz/QuizRunner.tsx`)
- Achievements → Progress store: reads progress (evidence: `app/(app)/conquistas/page.tsx`)
- Achievements → Progress rules: shows achievements (evidence: `app/(app)/conquistas/page.tsx`)
- Progress store → Progress rules: evaluates achievements (evidence: `lib/store.tsx`)
- Progress store → Learner: persists locally
- Diagram renderer → BPMN glyphs: renders nodes (evidence: `components/bpmn/DiagramView.tsx`)
- Lesson content blocks → Diagram renderer: renders diagrams (evidence: `components/dashboard/ContentBlocks.tsx`)
- App shell → Navigation and modes: uses navigation (evidence: `components/layout/AppShell.tsx`)
