# mh06a/portfolio-website architecture

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

- Interactive diagram: https://gitdiagram.com/mh06a/portfolio-website
- Repository: https://github.com/mh06a/portfolio-website

## Overview

This is a Supabase-backed portfolio administration data layer: administrators can authenticate and manage profile, skills, projects, experience, education, and certificates, with shared asset storage. The apparent feature workflow is use cases through repositories to Supabase data sources; repository-to-data-source delegation is visible in the excerpts, but use-case wiring is not. The README is empty and the entry point provides no workflow detail, so those links are left unverified rather than presented as established calls.

Main entry points: [`src/features/projects/data/repositories/project.repository.impl.js`](https://github.com/mh06a/portfolio-website/blob/main/src/features/projects/data/repositories/project.repository.impl.js) (Project repository), [`src/features/certificates/data/repositories/certificate.repository.impl.js`](https://github.com/mh06a/portfolio-website/blob/main/src/features/certificates/data/repositories/certificate.repository.impl.js) (Certificate repository), [`src/features/experience/domain/usecases`](https://github.com/mh06a/portfolio-website/tree/main/src/features/experience/domain/usecases) (Experience use cases), [`src/features/education/domain/usecases`](https://github.com/mh06a/portfolio-website/tree/main/src/features/education/domain/usecases) (Education use cases)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_auth["Admin authentication"]
  node_auth_cases["Auth use cases"]
  node_auth_repo["Auth repository"]
  node_auth_source["Auth data source"]
end

subgraph group_portfolio["Portfolio content"]
  node_profile_cases["Profile use cases"]
  node_profile_repo["Profile repository"]
  node_profile_source["Profile data source"]
  node_skills_cases["Skills use cases"]
  node_skills_repo["Skills repository"]
  node_skills_source["Skills data source"]
  node_projects_cases["Project use cases"]
  node_projects_repo["Project repository"]
  node_projects_source["Project data source"]
  node_projects_model["Project model<br/>[project.model.js]"]
  node_cert_cases["Certificate use cases"]
  node_cert_repo["Certificate repository"]
  node_cert_source["Certificate data source"]
  node_cert_model["Certificate model"]
end

subgraph group_career["Career history"]
  node_experience_cases["Experience use cases"]
  node_experience_repo["Experience repository"]
  node_experience_source["Experience data source"]
  node_experience_model["Experience model"]
  node_education_cases["Education use cases"]
  node_education_repo["Education repository"]
  node_education_source["Education data source"]
  node_education_model["Education model<br/>[education.model.js]"]
end

subgraph group_assets["Asset storage"]
  node_storage_repo["Storage repository"]
  node_storage_source["Storage data source"]
end

subgraph group_platform["Supabase platform"]
  node_supabase_client["Supabase client<br/>[supabase-client.js]"]
end

node_admin(("Administrator"))
node_supabase[("Supabase service")]

node_admin -.->|"initiates"| node_auth_cases
node_admin -.->|"manages"| node_profile_cases
node_admin -.->|"manages"| node_skills_cases
node_admin -.->|"manages"| node_projects_cases
node_admin -.->|"manages"| node_cert_cases
node_admin -.->|"manages"| node_experience_cases
node_admin -.->|"manages"| node_education_cases
node_auth_cases -.->|"uses"| node_auth_repo
node_auth_repo -->|"delegates to"| node_auth_source
node_profile_cases -.->|"uses"| node_profile_repo
node_profile_repo -->|"delegates to"| node_profile_source
node_skills_cases -.->|"uses"| node_skills_repo
node_skills_repo -->|"delegates to"| node_skills_source
node_projects_cases -.->|"uses"| node_projects_repo
node_projects_repo -->|"delegates to"| node_projects_source
node_projects_repo -->|"creates"| node_projects_model
node_cert_cases -.->|"uses"| node_cert_repo
node_cert_repo -->|"delegates to"| node_cert_source
node_cert_repo -->|"creates"| node_cert_model
node_experience_cases -.->|"uses"| node_experience_repo
node_experience_repo -->|"delegates to"| node_experience_source
node_experience_cases -.->|"manages"| node_experience_model
node_education_cases -.->|"uses"| node_education_repo
node_education_repo -->|"delegates to"| node_education_source
node_education_cases -.->|"manages"| node_education_model
node_storage_repo -->|"delegates to"| node_storage_source
node_storage_source -->|"uses client"| node_supabase_client
node_supabase_client -->|"connects to"| node_supabase

click node_auth_cases "https://github.com/mh06a/portfolio-website/tree/main/src/features/auth/domain/usecases"
click node_auth_repo "https://github.com/mh06a/portfolio-website/blob/main/src/features/auth/data/repositories/auth.repository.impl.js"
click node_auth_source "https://github.com/mh06a/portfolio-website/blob/main/src/features/auth/data/datasources/supabase-auth.datasource.js"
click node_profile_cases "https://github.com/mh06a/portfolio-website/tree/main/src/features/profile/domain/usecases"
click node_profile_repo "https://github.com/mh06a/portfolio-website/blob/main/src/features/profile/data/repositories/profile.repository.impl.js"
click node_profile_source "https://github.com/mh06a/portfolio-website/blob/main/src/features/profile/data/datasources/supabase-profile.datasource.js"
click node_skills_cases "https://github.com/mh06a/portfolio-website/tree/main/src/features/skills/domain/usecases"
click node_skills_repo "https://github.com/mh06a/portfolio-website/blob/main/src/features/skills/data/repositories/skill.repository.impl.js"
click node_skills_source "https://github.com/mh06a/portfolio-website/blob/main/src/features/skills/data/datasources/supabase-skill.datasource.js"
click node_projects_cases "https://github.com/mh06a/portfolio-website/tree/main/src/features/projects/domain/usecases"
click node_projects_repo "https://github.com/mh06a/portfolio-website/blob/main/src/features/projects/data/repositories/project.repository.impl.js"
click node_projects_source "https://github.com/mh06a/portfolio-website/blob/main/src/features/projects/data/datasources/supabase-project.datasource.js"
click node_projects_model "https://github.com/mh06a/portfolio-website/blob/main/src/features/projects/domain/models/project.model.js"
click node_cert_cases "https://github.com/mh06a/portfolio-website/tree/main/src/features/certificates/domain/usecases"
click node_cert_repo "https://github.com/mh06a/portfolio-website/blob/main/src/features/certificates/data/repositories/certificate.repository.impl.js"
click node_cert_source "https://github.com/mh06a/portfolio-website/blob/main/src/features/certificates/data/datasources/supabase-certificate.datasource.js"
click node_cert_model "https://github.com/mh06a/portfolio-website/blob/main/src/features/certificates/domain/models/certificate.model.js"
click node_experience_cases "https://github.com/mh06a/portfolio-website/tree/main/src/features/experience/domain/usecases"
click node_experience_repo "https://github.com/mh06a/portfolio-website/blob/main/src/features/experience/data/repositories/experience.repository.impl.js"
click node_experience_source "https://github.com/mh06a/portfolio-website/blob/main/src/features/experience/data/datasources/supabase-experience.datasource.js"
click node_experience_model "https://github.com/mh06a/portfolio-website/blob/main/src/features/experience/domain/models/experience.model.js"
click node_education_cases "https://github.com/mh06a/portfolio-website/tree/main/src/features/education/domain/usecases"
click node_education_repo "https://github.com/mh06a/portfolio-website/blob/main/src/features/education/data/repositories/education.repository.impl.js"
click node_education_source "https://github.com/mh06a/portfolio-website/blob/main/src/features/education/data/datasources/supabase-education.datasource.js"
click node_education_model "https://github.com/mh06a/portfolio-website/blob/main/src/features/education/domain/models/education.model.js"
click node_storage_repo "https://github.com/mh06a/portfolio-website/blob/main/src/shared/data/repositories/storage.repository.impl.js"
click node_storage_source "https://github.com/mh06a/portfolio-website/blob/main/src/shared/data/datasources/supabase-storage.datasource.js"
click node_supabase_client "https://github.com/mh06a/portfolio-website/blob/main/src/config/supabase/supabase-client.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_auth_cases,node_auth_repo,node_auth_source toneBlue
class node_profile_cases,node_profile_repo,node_profile_source,node_skills_cases,node_skills_repo,node_skills_source,node_projects_cases,node_projects_repo,node_projects_source,node_projects_model,node_cert_cases,node_cert_repo,node_cert_source,node_cert_model,node_supabase toneAmber
class node_experience_cases,node_experience_repo,node_experience_source,node_experience_model,node_education_cases,node_education_repo,node_education_source,node_education_model toneMint
class node_storage_repo,node_storage_source toneRose
class node_supabase_client,node_admin toneIndigo
```

## Components

### Admin authentication

- [Auth use cases](https://github.com/mh06a/portfolio-website/tree/main/src/features/auth/domain/usecases): `src/features/auth/domain/usecases`
- [Auth repository](https://github.com/mh06a/portfolio-website/blob/main/src/features/auth/data/repositories/auth.repository.impl.js): `src/features/auth/data/repositories/auth.repository.impl.js`
- [Auth data source](https://github.com/mh06a/portfolio-website/blob/main/src/features/auth/data/datasources/supabase-auth.datasource.js): `src/features/auth/data/datasources/supabase-auth.datasource.js`

### Portfolio content

- [Profile use cases](https://github.com/mh06a/portfolio-website/tree/main/src/features/profile/domain/usecases): `src/features/profile/domain/usecases`
- [Profile repository](https://github.com/mh06a/portfolio-website/blob/main/src/features/profile/data/repositories/profile.repository.impl.js): `src/features/profile/data/repositories/profile.repository.impl.js`
- [Profile data source](https://github.com/mh06a/portfolio-website/blob/main/src/features/profile/data/datasources/supabase-profile.datasource.js): `src/features/profile/data/datasources/supabase-profile.datasource.js`
- [Skills use cases](https://github.com/mh06a/portfolio-website/tree/main/src/features/skills/domain/usecases): `src/features/skills/domain/usecases`
- [Skills repository](https://github.com/mh06a/portfolio-website/blob/main/src/features/skills/data/repositories/skill.repository.impl.js): `src/features/skills/data/repositories/skill.repository.impl.js`
- [Skills data source](https://github.com/mh06a/portfolio-website/blob/main/src/features/skills/data/datasources/supabase-skill.datasource.js): `src/features/skills/data/datasources/supabase-skill.datasource.js`
- [Project use cases](https://github.com/mh06a/portfolio-website/tree/main/src/features/projects/domain/usecases): `src/features/projects/domain/usecases`
- [Project repository](https://github.com/mh06a/portfolio-website/blob/main/src/features/projects/data/repositories/project.repository.impl.js): `src/features/projects/data/repositories/project.repository.impl.js`
- [Project data source](https://github.com/mh06a/portfolio-website/blob/main/src/features/projects/data/datasources/supabase-project.datasource.js): `src/features/projects/data/datasources/supabase-project.datasource.js`
- [Project model](https://github.com/mh06a/portfolio-website/blob/main/src/features/projects/domain/models/project.model.js): `src/features/projects/domain/models/project.model.js`
- [Certificate use cases](https://github.com/mh06a/portfolio-website/tree/main/src/features/certificates/domain/usecases): `src/features/certificates/domain/usecases`
- [Certificate repository](https://github.com/mh06a/portfolio-website/blob/main/src/features/certificates/data/repositories/certificate.repository.impl.js): `src/features/certificates/data/repositories/certificate.repository.impl.js`
- [Certificate data source](https://github.com/mh06a/portfolio-website/blob/main/src/features/certificates/data/datasources/supabase-certificate.datasource.js): `src/features/certificates/data/datasources/supabase-certificate.datasource.js`
- [Certificate model](https://github.com/mh06a/portfolio-website/blob/main/src/features/certificates/domain/models/certificate.model.js): `src/features/certificates/domain/models/certificate.model.js`

### Career history

- [Experience use cases](https://github.com/mh06a/portfolio-website/tree/main/src/features/experience/domain/usecases): `src/features/experience/domain/usecases`
- [Experience repository](https://github.com/mh06a/portfolio-website/blob/main/src/features/experience/data/repositories/experience.repository.impl.js): `src/features/experience/data/repositories/experience.repository.impl.js`
- [Experience data source](https://github.com/mh06a/portfolio-website/blob/main/src/features/experience/data/datasources/supabase-experience.datasource.js): `src/features/experience/data/datasources/supabase-experience.datasource.js`
- [Experience model](https://github.com/mh06a/portfolio-website/blob/main/src/features/experience/domain/models/experience.model.js): `src/features/experience/domain/models/experience.model.js`
- [Education use cases](https://github.com/mh06a/portfolio-website/tree/main/src/features/education/domain/usecases): `src/features/education/domain/usecases`
- [Education repository](https://github.com/mh06a/portfolio-website/blob/main/src/features/education/data/repositories/education.repository.impl.js): `src/features/education/data/repositories/education.repository.impl.js`
- [Education data source](https://github.com/mh06a/portfolio-website/blob/main/src/features/education/data/datasources/supabase-education.datasource.js): `src/features/education/data/datasources/supabase-education.datasource.js`
- [Education model](https://github.com/mh06a/portfolio-website/blob/main/src/features/education/domain/models/education.model.js): `src/features/education/domain/models/education.model.js`

### Asset storage

- [Storage repository](https://github.com/mh06a/portfolio-website/blob/main/src/shared/data/repositories/storage.repository.impl.js): `src/shared/data/repositories/storage.repository.impl.js`
- [Storage data source](https://github.com/mh06a/portfolio-website/blob/main/src/shared/data/datasources/supabase-storage.datasource.js): `src/shared/data/datasources/supabase-storage.datasource.js`

### Supabase platform

- [Supabase client](https://github.com/mh06a/portfolio-website/blob/main/src/config/supabase/supabase-client.js): `src/config/supabase/supabase-client.js`

### Other components

- **Administrator**
- **Supabase service**

## Connections

- Administrator → Auth use cases: initiates
- Administrator → Profile use cases: manages
- Administrator → Skills use cases: manages
- Administrator → Project use cases: manages
- Administrator → Certificate use cases: manages
- Administrator → Experience use cases: manages
- Administrator → Education use cases: manages
- Auth use cases → Auth repository: uses
- Auth repository → Auth data source: delegates to (evidence: `src/features/auth/data/repositories/auth.repository.impl.js`)
- Profile use cases → Profile repository: uses
- Profile repository → Profile data source: delegates to (evidence: `src/features/profile/data/repositories/profile.repository.impl.js`)
- Skills use cases → Skills repository: uses
- Skills repository → Skills data source: delegates to (evidence: `src/features/skills/data/repositories/skill.repository.impl.js`)
- Project use cases → Project repository: uses
- Project repository → Project data source: delegates to (evidence: `src/features/projects/data/repositories/project.repository.impl.js`)
- Project repository → Project model: creates (evidence: `src/features/projects/data/repositories/project.repository.impl.js`)
- Certificate use cases → Certificate repository: uses
- Certificate repository → Certificate data source: delegates to (evidence: `src/features/certificates/data/repositories/certificate.repository.impl.js`)
- Certificate repository → Certificate model: creates (evidence: `src/features/certificates/data/repositories/certificate.repository.impl.js`)
- Experience use cases → Experience repository: uses
- Experience repository → Experience data source: delegates to (evidence: `src/features/experience/data/repositories/experience.repository.impl.js`)
- Experience use cases → Experience model: manages
- Education use cases → Education repository: uses
- Education repository → Education data source: delegates to (evidence: `src/features/education/data/repositories/education.repository.impl.js`)
- Education use cases → Education model: manages
- Storage repository → Storage data source: delegates to (evidence: `src/shared/data/repositories/storage.repository.impl.js`)
- Storage data source → Supabase client: uses client (evidence: `src/shared/data/datasources/supabase-storage.datasource.js`)
- Supabase client → Supabase service: connects to (evidence: `src/config/supabase/supabase-client.js`)
