# alamgircanb/pmport architecture

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

- Interactive diagram: https://gitdiagram.com/alamgircanb/pmport
- Repository: https://github.com/alamgircanb/pmport

## Overview

PMPORT is an Angular project-management learning platform and portfolio. Visitors browse learning content, use practice tools, and can track progress locally; members may sign in when Supabase is configured, and the contact form sends a message through a serverless function. The map preserves the documented exam, calculator, data-lab, simulation, artifact, and portfolio capabilities. Some page implementations and route declarations were not sampled, so those branches are shown without asserting internal calls.

Main entry points: [`src/app/app.routes.ts`](https://github.com/alamgircanb/pmport/blob/main/src/app/app.routes.ts) (Page routing), [`src/app/app.component.ts`](https://github.com/alamgircanb/pmport/blob/main/src/app/app.component.ts) (Site shell), [`src/main.ts`](https://github.com/alamgircanb/pmport/blob/main/src/main.ts) (App bootstrap), [`src/app/pages/pmp-exam/exam-engine.ts`](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/pmp-exam/exam-engine.ts) (Exam simulators)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application shell"]
  node_bootstrap["App bootstrap<br/>[main.ts]"]
  node_shell["Site shell<br/>[app.component.ts]"]
  node_routing["Page routing<br/>[app.routes.ts]"]
end

subgraph group_learning["Learning content"]
  node_articles["Articles and guides"]
  node_journeys["Learning journeys"]
  node_portfolio["Portfolio"]
end

subgraph group_practice["Practice tools"]
  node_exams["Exam simulators<br/>[exam-engine.ts]"]
  node_examtypes["Exam types<br/>[exam-types.ts]"]
  node_calculators["Calculators"]
  node_datalab["Data labs<br/>[excel-engine.ts]"]
  node_playground["Simulations"]
  node_artifacts["Project artifacts"]
end

subgraph group_shared["Shared services"]
  node_search["Site search"]
  node_progress["Progress tracking"]
  node_analytics["Analytics events<br/>[analytics.ts]"]
  node_auth["Authentication<br/>[auth.service.ts]"]
end

subgraph group_external["External services"]
  node_supabase["Supabase"]
  node_contact["Contact function<br/>[contact.mjs]"]
  node_resend["Resend email"]
end

node_visitor(("Visitor"))

node_visitor -->|"opens site"| node_bootstrap
node_bootstrap -->|"bootstraps"| node_shell
node_bootstrap -->|"configures routes"| node_routing
node_shell -->|"navigates pages"| node_routing
node_routing -->|"loads pages"| node_articles
node_routing -->|"loads pages"| node_exams
node_routing -->|"loads pages"| node_calculators
node_routing -->|"loads pages"| node_datalab
node_routing -->|"loads pages"| node_playground
node_routing -.->|"loads pages"| node_portfolio
node_routing -.->|"loads pages"| node_artifacts
node_shell -->|"opens search"| node_search
node_search -->|"tracks searches"| node_analytics
node_shell -->|"starts tracking"| node_progress
node_progress -->|"subscribes to events"| node_analytics
node_exams -->|"uses types"| node_examtypes
node_auth -->|"authenticates"| node_supabase
node_visitor -.->|"sends message"| node_contact
node_contact -.->|"sends email"| node_resend

click node_bootstrap "https://github.com/alamgircanb/pmport/blob/main/src/main.ts"
click node_shell "https://github.com/alamgircanb/pmport/blob/main/src/app/app.component.ts"
click node_routing "https://github.com/alamgircanb/pmport/blob/main/src/app/app.routes.ts"
click node_articles "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/article/article.component.ts"
click node_journeys "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/journeys/journey.component.ts"
click node_exams "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/pmp-exam/exam-engine.ts"
click node_examtypes "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/pmp-exam/exam-types.ts"
click node_calculators "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/calculators/calculators-hub.component.ts"
click node_datalab "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/datalab/excel-engine.ts"
click node_playground "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/playground/playground.component.ts"
click node_artifacts "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/pm-tools/pm-tools.component.ts"
click node_portfolio "https://github.com/alamgircanb/pmport/blob/main/src/app/pages/portfolio/portfolio.component.ts"
click node_search "https://github.com/alamgircanb/pmport/blob/main/src/app/core/search/site-search.component.ts"
click node_progress "https://github.com/alamgircanb/pmport/blob/main/src/app/core/progress/progress.service.ts"
click node_analytics "https://github.com/alamgircanb/pmport/blob/main/src/app/core/analytics.ts"
click node_auth "https://github.com/alamgircanb/pmport/blob/main/src/app/core/auth/auth.service.ts"
click node_contact "https://github.com/alamgircanb/pmport/blob/main/api/contact.mjs"

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_shell,node_routing toneBlue
class node_articles,node_journeys,node_portfolio toneAmber
class node_exams,node_examtypes,node_calculators,node_datalab,node_playground,node_artifacts toneMint
class node_search,node_progress,node_analytics,node_auth toneRose
class node_supabase,node_contact,node_resend,node_visitor toneIndigo
```

## Components

### Application shell

- [App bootstrap](https://github.com/alamgircanb/pmport/blob/main/src/main.ts): `src/main.ts`
- [Site shell](https://github.com/alamgircanb/pmport/blob/main/src/app/app.component.ts): `src/app/app.component.ts`
- [Page routing](https://github.com/alamgircanb/pmport/blob/main/src/app/app.routes.ts): `src/app/app.routes.ts`

### Learning content

- [Articles and guides](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/article/article.component.ts): `src/app/pages/article/article.component.ts`
- [Learning journeys](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/journeys/journey.component.ts): `src/app/pages/journeys/journey.component.ts`
- [Portfolio](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/portfolio/portfolio.component.ts): `src/app/pages/portfolio/portfolio.component.ts`

### Practice tools

- [Exam simulators](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/pmp-exam/exam-engine.ts): `src/app/pages/pmp-exam/exam-engine.ts`
- [Exam types](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/pmp-exam/exam-types.ts): `src/app/pages/pmp-exam/exam-types.ts`
- [Calculators](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/calculators/calculators-hub.component.ts): `src/app/pages/calculators/calculators-hub.component.ts`
- [Data labs](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/datalab/excel-engine.ts): `src/app/pages/datalab/excel-engine.ts`
- [Simulations](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/playground/playground.component.ts): `src/app/pages/playground/playground.component.ts`
- [Project artifacts](https://github.com/alamgircanb/pmport/blob/main/src/app/pages/pm-tools/pm-tools.component.ts): `src/app/pages/pm-tools/pm-tools.component.ts`

### Shared services

- [Site search](https://github.com/alamgircanb/pmport/blob/main/src/app/core/search/site-search.component.ts): `src/app/core/search/site-search.component.ts`
- [Progress tracking](https://github.com/alamgircanb/pmport/blob/main/src/app/core/progress/progress.service.ts): `src/app/core/progress/progress.service.ts`
- [Analytics events](https://github.com/alamgircanb/pmport/blob/main/src/app/core/analytics.ts): `src/app/core/analytics.ts`
- [Authentication](https://github.com/alamgircanb/pmport/blob/main/src/app/core/auth/auth.service.ts): `src/app/core/auth/auth.service.ts`

### External services

- **Supabase**
- [Contact function](https://github.com/alamgircanb/pmport/blob/main/api/contact.mjs): `api/contact.mjs`
- **Resend email**

### Other components

- **Visitor**

## Connections

- Visitor → App bootstrap: opens site (evidence: `src/main.ts`)
- App bootstrap → Site shell: bootstraps (evidence: `src/main.ts`)
- App bootstrap → Page routing: configures routes
- Site shell → Page routing: navigates pages (evidence: `src/app/app.component.ts`)
- Page routing → Articles and guides: loads pages (evidence: `src/app/app.routes.ts`)
- Page routing → Exam simulators: loads pages (evidence: `src/app/app.routes.ts`)
- Page routing → Calculators: loads pages (evidence: `src/app/app.routes.ts`)
- Page routing → Data labs: loads pages (evidence: `src/app/app.routes.ts`)
- Page routing → Simulations: loads pages (evidence: `src/app/app.routes.ts`)
- Page routing → Portfolio: loads pages (evidence: `src/app/app.routes.ts`)
- Page routing → Project artifacts: loads pages (evidence: `src/app/app.routes.ts`)
- Site shell → Site search: opens search (evidence: `src/app/app.component.ts`)
- Site search → Analytics events: tracks searches (evidence: `src/app/core/search/site-search.component.ts`)
- Site shell → Progress tracking: starts tracking (evidence: `src/app/app.component.ts`)
- Progress tracking → Analytics events: subscribes to events (evidence: `src/app/core/progress/progress.service.ts`)
- Exam simulators → Exam types: uses types (evidence: `src/app/pages/pmp-exam/exam-engine.ts`)
- Authentication → Supabase: authenticates (evidence: `src/app/core/auth/auth.service.ts`)
- Visitor → Contact function: sends message (evidence: `README.md`)
- Contact function → Resend email: sends email (evidence: `README.md`)
