# arajmir7/ajmir-aribam-portfolio architecture

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

- Interactive diagram: https://gitdiagram.com/arajmir7/ajmir-aribam-portfolio
- Repository: https://github.com/arajmir7/ajmir-aribam-portfolio

## Overview

This repository is a personal portfolio with a private inquiry service. Visitors browse profile, work, and writing pages; prospective contacts submit an inquiry through the same-origin form endpoint, which forwards it to FastAPI for persistence and email notification. The README documents the private service binding, Neon storage, and Resend delivery. Several backend route and service implementations, as well as page wiring, were not sampled, so only documented relationships are shown.

Main entry points: [`frontend/src/app/api/contact/route.ts`](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/api/contact/route.ts) (Contact endpoint), [`backend/app/services/inquiries.py`](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/inquiries.py) (Inquiry service), [`backend/app/services/email_outbox.py`](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/email_outbox.py) (Email outbox), [`backend/app/db/database.py`](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/db/database.py) (PostgreSQL)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_site["Portfolio site"]
  node_home["Home page<br/>[page.tsx]"]
  node_profile["Profile pages<br/>[page.tsx]"]
  node_work["Work pages<br/>[page.tsx]"]
  node_workdetail["Work detail<br/>[page.tsx]"]
  node_notes["Writing pages<br/>[page.tsx]"]
  node_projectcontent["Project content<br/>[projects.ts]"]
  node_writingcontent["Writing content<br/>[writing.ts]"]
end

subgraph group_contact["Inquiry handling"]
  node_contactpage["Contact page<br/>[page.tsx]"]
  node_form["Inquiry form<br/>[contact-form.tsx]"]
  node_contactapi["Contact endpoint<br/>[route.ts]"]
  node_security["Contact safeguards"]
end

subgraph group_backend["Private inquiry service"]
  node_fastapi["FastAPI app<br/>[main.py]"]
  node_contactroute["Inquiry route<br/>[contact.py]"]
  node_inquiries["Inquiry service<br/>[inquiries.py]"]
  node_models["Inquiry records<br/>[models.py]"]
  node_database[("PostgreSQL<br/>[database.py]")]
  node_outbox["Email outbox<br/>[email_outbox.py]"]
  node_notifications["Email notifications<br/>[notifications.py]"]
end

subgraph group_ops["Health and telemetry"]
  node_health["Health endpoint<br/>[health.py]"]
  node_telemetry["Telemetry endpoint<br/>[route.ts]"]
  node_vitals["Browser vitals<br/>[web-vitals.tsx]"]
end

node_visitor(("Visitor"))
node_resend["Resend"]

node_visitor -->|"browses"| node_home
node_visitor -->|"browses"| node_profile
node_visitor -->|"browses"| node_work
node_visitor -->|"browses"| node_workdetail
node_visitor -->|"browses"| node_notes
node_work -->|"reads"| node_projectcontent
node_workdetail -->|"reads"| node_projectcontent
node_notes -->|"reads"| node_writingcontent
node_visitor -->|"opens"| node_contactpage
node_contactpage -->|"renders"| node_form
node_form -->|"posts inquiry"| node_contactapi
node_contactapi -->|"validates with"| node_security
node_contactapi -->|"forwards inquiry"| node_fastapi
node_fastapi -->|"dispatches"| node_contactroute
node_contactroute -->|"handles inquiry"| node_inquiries
node_inquiries -->|"persists records"| node_database
node_database -->|"stores"| node_models
node_inquiries -->|"queues delivery"| node_outbox
node_outbox -->|"claims and updates"| node_database
node_outbox -->|"sends notification"| node_notifications
node_notifications -->|"delivers email"| node_resend
node_visitor -->|"checks status"| node_health
node_vitals -->|"posts metrics"| node_telemetry

click node_home "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/page.tsx"
click node_profile "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/about/page.tsx"
click node_work "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/work/page.tsx"
click node_workdetail "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/work/%5Bslug%5D/page.tsx"
click node_notes "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/notes/page.tsx"
click node_projectcontent "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/content/projects.ts"
click node_writingcontent "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/content/writing.ts"
click node_contactpage "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/contact/page.tsx"
click node_form "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/features/contact/contact-form.tsx"
click node_contactapi "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/api/contact/route.ts"
click node_security "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/lib/contact-security.ts"
click node_fastapi "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/main.py"
click node_contactroute "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/api/routes/contact.py"
click node_inquiries "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/inquiries.py"
click node_models "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/db/models.py"
click node_database "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/db/database.py"
click node_outbox "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/email_outbox.py"
click node_notifications "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/notifications.py"
click node_health "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/api/routes/health.py"
click node_telemetry "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/api/telemetry/route.ts"
click node_vitals "https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/features/telemetry/web-vitals.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_profile,node_work,node_workdetail,node_notes,node_projectcontent,node_writingcontent toneBlue
class node_contactpage,node_form,node_contactapi,node_security toneAmber
class node_fastapi,node_contactroute,node_inquiries,node_models,node_database,node_outbox,node_notifications toneMint
class node_health,node_telemetry,node_vitals toneRose
class node_visitor,node_resend toneIndigo
```

## Components

### Portfolio site

- [Home page](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/page.tsx): `frontend/src/app/page.tsx`
- [Profile pages](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/about/page.tsx): `frontend/src/app/about/page.tsx`
- [Work pages](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/work/page.tsx): `frontend/src/app/work/page.tsx`
- [Work detail](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/work/%5Bslug%5D/page.tsx): `frontend/src/app/work/[slug]/page.tsx`
- [Writing pages](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/notes/page.tsx): `frontend/src/app/notes/page.tsx`
- [Project content](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/content/projects.ts): `frontend/src/content/projects.ts`
- [Writing content](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/content/writing.ts): `frontend/src/content/writing.ts`

### Inquiry handling

- [Contact page](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/contact/page.tsx): `frontend/src/app/contact/page.tsx`
- [Inquiry form](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/features/contact/contact-form.tsx): `frontend/src/features/contact/contact-form.tsx`
- [Contact endpoint](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/api/contact/route.ts): `frontend/src/app/api/contact/route.ts`
- [Contact safeguards](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/lib/contact-security.ts): `frontend/src/lib/contact-security.ts`

### Private inquiry service

- [FastAPI app](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/main.py): `backend/app/main.py`
- [Inquiry route](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/api/routes/contact.py): `backend/app/api/routes/contact.py`
- [Inquiry service](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/inquiries.py): `backend/app/services/inquiries.py`
- [Inquiry records](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/db/models.py): `backend/app/db/models.py`
- [PostgreSQL](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/db/database.py): `backend/app/db/database.py`
- [Email outbox](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/email_outbox.py): `backend/app/services/email_outbox.py`
- [Email notifications](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/services/notifications.py): `backend/app/services/notifications.py`

### Health and telemetry

- [Health endpoint](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/backend/app/api/routes/health.py): `backend/app/api/routes/health.py`
- [Telemetry endpoint](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/app/api/telemetry/route.ts): `frontend/src/app/api/telemetry/route.ts`
- [Browser vitals](https://github.com/arajmir7/ajmir-aribam-portfolio/blob/main/frontend/src/features/telemetry/web-vitals.tsx): `frontend/src/features/telemetry/web-vitals.tsx`

### Other components

- **Visitor**
- **Resend**

## Connections

- Visitor → Home page: browses
- Visitor → Profile pages: browses
- Visitor → Work pages: browses
- Visitor → Work detail: browses
- Visitor → Writing pages: browses
- Work pages → Project content: reads
- Work detail → Project content: reads
- Writing pages → Writing content: reads
- Visitor → Contact page: opens
- Contact page → Inquiry form: renders
- Inquiry form → Contact endpoint: posts inquiry
- Contact endpoint → Contact safeguards: validates with
- Contact endpoint → FastAPI app: forwards inquiry
- FastAPI app → Inquiry route: dispatches
- Inquiry route → Inquiry service: handles inquiry
- Inquiry service → PostgreSQL: persists records
- PostgreSQL → Inquiry records: stores
- Inquiry service → Email outbox: queues delivery
- Email outbox → PostgreSQL: claims and updates
- Email outbox → Email notifications: sends notification
- Email notifications → Resend: delivers email
- Visitor → Health endpoint: checks status
- Browser vitals → Telemetry endpoint: posts metrics
