# tysia-fr/portfolio architecture

> Architecture diagram of the GitHub repository tysia-fr/portfolio, 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/tysia-fr/portfolio
- Repository: https://github.com/tysia-fr/portfolio

## Overview

This is a French-language personal portfolio for Siavash Izadi. A visitor browses the home page and project case studies, reads profile and career information, or submits a contact form; project and page content is typed, static repository data. The site also presents its delivery pipeline and a shared logo animation, with a separate Remotion video capability. The graph reflects documented and indexed relationships; unsampled page wiring is not inferred.

Main entry points: [`src/lib/projects.ts`](https://github.com/tysia-fr/portfolio/blob/main/src/lib/projects.ts) (Project queries), [`src/app/page.tsx`](https://github.com/tysia-fr/portfolio/blob/main/src/app/page.tsx) (Home page), [`src/components/contact/contact-form.tsx`](https://github.com/tysia-fr/portfolio/blob/main/src/components/contact/contact-form.tsx) (Contact form), [`src/app/api/contact/route.ts`](https://github.com/tysia-fr/portfolio/blob/main/src/app/api/contact/route.ts) (Contact endpoint)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_pages["Visitor experience"]
  node_home["Home page<br/>[page.tsx]"]
  node_project_list["Project listing<br/>[page.tsx]"]
  node_case_study["Project case study<br/>[page.tsx]"]
  node_profile_pages["Profile and CV<br/>[page.tsx]"]
  node_career_page["Career page<br/>[page.tsx]"]
  node_legal_page["Legal page<br/>[page.tsx]"]
  node_pipeline_diagram["Delivery diagram"]
end

subgraph group_content["Portfolio content"]
  node_project_access["Project queries<br/>[projects.ts]"]
  node_project_data["Project catalogue<br/>[index.ts]"]
  node_project_schema["Project schema<br/>[schema.ts]"]
  node_site_content["Site copy"]
  node_pipeline_content["Pipeline description<br/>[pipeline.ts]"]
  node_metadata["Page metadata<br/>[metadata.ts]"]
end

subgraph group_contact["Contact flow"]
  node_contact_page["Contact page<br/>[page.tsx]"]
  node_contact_form["Contact form<br/>[contact-form.tsx]"]
  node_contact_api["Contact endpoint<br/>[route.ts]"]
  node_contact_checks["Validation and limits"]
  node_email_sender["Email delivery<br/>[email.ts]"]
end

subgraph group_identity["Brand and motion"]
  node_site_logo["Site logo animation"]
  node_logo_geometry["Shared logo geometry<br/>[logo-geometry.ts]"]
  node_video_logo["Logo video<br/>[LogoSignal.tsx]"]
end

node_visitor(("Site visitor"))
node_resend["Resend"]

node_visitor -->|"browses"| node_home
node_home -->|"loads featured"| node_project_access
node_home -->|"renders"| node_pipeline_diagram
node_pipeline_diagram -->|"reads steps"| node_pipeline_content
node_project_list -->|"loads projects"| node_project_access
node_case_study -->|"loads case study"| node_project_access
node_project_access -->|"parses catalogue"| node_project_data
node_project_access -->|"validates entries"| node_project_schema
node_profile_pages -->|"reads profile copy"| node_site_content
node_career_page -->|"reads career copy"| node_site_content
node_legal_page -->|"reads legal copy"| node_site_content
node_contact_page -->|"renders form"| node_contact_form
node_contact_form -->|"submits message"| node_contact_api
node_contact_form -->|"uses limits"| node_contact_checks
node_contact_api -->|"validates and limits"| node_contact_checks
node_contact_api -->|"sends message"| node_email_sender
node_email_sender -->|"delivers email"| node_resend
node_site_logo -->|"shares geometry"| node_logo_geometry
node_video_logo -->|"shares geometry"| node_logo_geometry
node_visitor -.->|"browses"| node_project_list
node_visitor -.->|"opens contact"| node_contact_page

click node_home "https://github.com/tysia-fr/portfolio/blob/main/src/app/page.tsx"
click node_project_list "https://github.com/tysia-fr/portfolio/blob/main/src/app/projets/page.tsx"
click node_case_study "https://github.com/tysia-fr/portfolio/blob/main/src/app/projets/%5Bslug%5D/page.tsx"
click node_profile_pages "https://github.com/tysia-fr/portfolio/blob/main/src/app/a-propos/page.tsx"
click node_career_page "https://github.com/tysia-fr/portfolio/blob/main/src/app/alternance/page.tsx"
click node_legal_page "https://github.com/tysia-fr/portfolio/blob/main/src/app/mentions-legales/page.tsx"
click node_pipeline_diagram "https://github.com/tysia-fr/portfolio/blob/main/src/components/pipeline/pipeline-diagram.tsx"
click node_project_access "https://github.com/tysia-fr/portfolio/blob/main/src/lib/projects.ts"
click node_project_data "https://github.com/tysia-fr/portfolio/blob/main/src/content/projects/index.ts"
click node_project_schema "https://github.com/tysia-fr/portfolio/blob/main/src/content/projects/schema.ts"
click node_site_content "https://github.com/tysia-fr/portfolio/tree/main/src/content"
click node_pipeline_content "https://github.com/tysia-fr/portfolio/blob/main/src/content/pipeline.ts"
click node_metadata "https://github.com/tysia-fr/portfolio/blob/main/src/lib/metadata.ts"
click node_contact_page "https://github.com/tysia-fr/portfolio/blob/main/src/app/contact/page.tsx"
click node_contact_form "https://github.com/tysia-fr/portfolio/blob/main/src/components/contact/contact-form.tsx"
click node_contact_api "https://github.com/tysia-fr/portfolio/blob/main/src/app/api/contact/route.ts"
click node_contact_checks "https://github.com/tysia-fr/portfolio/tree/main/src/lib/contact"
click node_email_sender "https://github.com/tysia-fr/portfolio/blob/main/src/lib/contact/email.ts"
click node_site_logo "https://github.com/tysia-fr/portfolio/tree/main/src/components/brand"
click node_logo_geometry "https://github.com/tysia-fr/portfolio/blob/main/src/components/brand/logo-geometry.ts"
click node_video_logo "https://github.com/tysia-fr/portfolio/blob/main/motion/src/LogoSignal.tsx"

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_home,node_project_list,node_case_study,node_profile_pages,node_career_page,node_legal_page,node_pipeline_diagram toneBlue
class node_project_access,node_project_data,node_project_schema,node_site_content,node_pipeline_content,node_metadata toneAmber
class node_contact_page,node_contact_form,node_contact_api,node_contact_checks,node_email_sender toneMint
class node_site_logo,node_logo_geometry,node_video_logo toneRose
class node_visitor,node_resend toneIndigo
```

## Components

### Visitor experience

- [Home page](https://github.com/tysia-fr/portfolio/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [Project listing](https://github.com/tysia-fr/portfolio/blob/main/src/app/projets/page.tsx): `src/app/projets/page.tsx`
- [Project case study](https://github.com/tysia-fr/portfolio/blob/main/src/app/projets/%5Bslug%5D/page.tsx): `src/app/projets/[slug]/page.tsx`
- [Profile and CV](https://github.com/tysia-fr/portfolio/blob/main/src/app/a-propos/page.tsx): `src/app/a-propos/page.tsx`
- [Career page](https://github.com/tysia-fr/portfolio/blob/main/src/app/alternance/page.tsx): `src/app/alternance/page.tsx`
- [Legal page](https://github.com/tysia-fr/portfolio/blob/main/src/app/mentions-legales/page.tsx): `src/app/mentions-legales/page.tsx`
- [Delivery diagram](https://github.com/tysia-fr/portfolio/blob/main/src/components/pipeline/pipeline-diagram.tsx): `src/components/pipeline/pipeline-diagram.tsx`

### Portfolio content

- [Project queries](https://github.com/tysia-fr/portfolio/blob/main/src/lib/projects.ts): `src/lib/projects.ts`
- [Project catalogue](https://github.com/tysia-fr/portfolio/blob/main/src/content/projects/index.ts): `src/content/projects/index.ts`
- [Project schema](https://github.com/tysia-fr/portfolio/blob/main/src/content/projects/schema.ts): `src/content/projects/schema.ts`
- [Site copy](https://github.com/tysia-fr/portfolio/tree/main/src/content): `src/content`
- [Pipeline description](https://github.com/tysia-fr/portfolio/blob/main/src/content/pipeline.ts): `src/content/pipeline.ts`
- [Page metadata](https://github.com/tysia-fr/portfolio/blob/main/src/lib/metadata.ts): `src/lib/metadata.ts`

### Contact flow

- [Contact page](https://github.com/tysia-fr/portfolio/blob/main/src/app/contact/page.tsx): `src/app/contact/page.tsx`
- [Contact form](https://github.com/tysia-fr/portfolio/blob/main/src/components/contact/contact-form.tsx): `src/components/contact/contact-form.tsx`
- [Contact endpoint](https://github.com/tysia-fr/portfolio/blob/main/src/app/api/contact/route.ts): `src/app/api/contact/route.ts`
- [Validation and limits](https://github.com/tysia-fr/portfolio/tree/main/src/lib/contact): `src/lib/contact`
- [Email delivery](https://github.com/tysia-fr/portfolio/blob/main/src/lib/contact/email.ts): `src/lib/contact/email.ts`

### Brand and motion

- [Site logo animation](https://github.com/tysia-fr/portfolio/tree/main/src/components/brand): `src/components/brand`
- [Shared logo geometry](https://github.com/tysia-fr/portfolio/blob/main/src/components/brand/logo-geometry.ts): `src/components/brand/logo-geometry.ts`
- [Logo video](https://github.com/tysia-fr/portfolio/blob/main/motion/src/LogoSignal.tsx): `motion/src/LogoSignal.tsx`

### Other components

- **Site visitor**
- **Resend**

## Connections

- Site visitor → Home page: browses
- Home page → Project queries: loads featured (evidence: `src/app/page.tsx`)
- Home page → Delivery diagram: renders (evidence: `src/app/page.tsx`)
- Delivery diagram → Pipeline description: reads steps (evidence: `src/components/pipeline/pipeline-diagram.tsx`)
- Project listing → Project queries: loads projects (evidence: `src/app/projets/page.tsx`)
- Project case study → Project queries: loads case study (evidence: `src/app/projets/[slug]/page.tsx`)
- Project queries → Project catalogue: parses catalogue (evidence: `src/lib/projects.ts`)
- Project queries → Project schema: validates entries (evidence: `src/lib/projects.ts`)
- Profile and CV → Site copy: reads profile copy (evidence: `src/app/a-propos/page.tsx`)
- Career page → Site copy: reads career copy (evidence: `src/app/alternance/page.tsx`)
- Legal page → Site copy: reads legal copy (evidence: `src/app/mentions-legales/page.tsx`)
- Contact page → Contact form: renders form (evidence: `src/app/contact/page.tsx`)
- Contact form → Contact endpoint: submits message (evidence: `README.md`)
- Contact form → Validation and limits: uses limits (evidence: `src/components/contact/contact-form.tsx`)
- Contact endpoint → Validation and limits: validates and limits (evidence: `src/app/api/contact/route.ts`)
- Contact endpoint → Email delivery: sends message (evidence: `src/app/api/contact/route.ts`)
- Email delivery → Resend: delivers email (evidence: `README.md`)
- Site logo animation → Shared logo geometry: shares geometry (evidence: `README.md`)
- Logo video → Shared logo geometry: shares geometry (evidence: `README.md`)
- Site visitor → Project listing: browses
- Site visitor → Contact page: opens contact
