# rbarcoma/my-portfolio architecture

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

## Overview

This is a Laravel/Inertia portfolio site: visitors browse profile, skills, experience, projects and GitHub activity, with a contact form as its principal write workflow. Laravel routes dispatch to controllers, which provide Inertia pages or JSON; the React app renders those pages. Contact submissions are validated, stored and notified. GitHub statistics are fetched and cached, with a signed push webhook invalidating activity data. Several frontend page/controller pairings and configuration details are not shown in excerpts, so their links are omitted rather than inferred.

Main entry points: [`routes/web.php`](https://github.com/rbarcoma/my-portfolio/blob/main/routes/web.php) (Web routes), [`app/Http/Controllers/HomeController.php`](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/HomeController.php) (Home controller), [`app/Http/Controllers/ProjectController.php`](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ProjectController.php) (Project controller), [`app/Http/Controllers/ContactController.php`](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ContactController.php) (Contact controller)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web presentation"]
  node_home_page["Home page<br/>[Home.jsx]"]
  node_project_pages["Project pages<br/>[Index.jsx]"]
  node_about_page["About page<br/>[About.jsx]"]
  node_experience_page["Experience page<br/>[Experience.jsx]"]
  node_skills_page["Skills page<br/>[Skills.jsx]"]
  node_contact_page["Contact page<br/>[Contact.jsx]"]
  node_project_detail["Project detail<br/>[Show.jsx]"]
  node_react_app["Inertia React app<br/>[app.jsx]"]
  node_root_layout["Root layout<br/>[RootLayout.jsx]"]
end

subgraph group_portfolio["Portfolio content"]
  node_home_ctl["Home controller<br/>[HomeController.php]"]
  node_project_ctl["Project controller"]
  node_about_ctl["About controller"]
  node_experience_ctl["Experience controller"]
  node_skills_ctl["Skills controller"]
  node_cv_ctl["CV controller<br/>[CvController.php]"]
  node_content_config["Portfolio data<br/>[portfolio.php]"]
  node_project_config["Project data<br/>[projects.php]"]
end

subgraph group_contact["Contact workflow"]
  node_contact_ctl["Contact controller"]
  node_contact_request["Contact validation"]
  node_contact_model[("Contact messages<br/>[ContactMessage.php]")]
  node_contact_notice["Contact notification"]
end

subgraph group_github["GitHub integration"]
  node_github_panel["GitHub panel<br/>[GitHubPanel.jsx]"]
  node_github_hook["GitHub stats hook<br/>[useGithubStats.js]"]
  node_github_ctl["GitHub endpoints"]
  node_github_service["GitHub service<br/>[GitHubService.php]"]
end

subgraph group_framework["Laravel runtime"]
  node_routes["Web routes<br/>[web.php]"]
  node_inertia_middleware["Inertia middleware"]
  node_app_boot["Application bootstrap<br/>[app.php]"]
  node_blade_shell["HTML shell<br/>[app.blade.php]"]
end

node_visitor(("Visitor"))
node_github_api["GitHub API"]

node_visitor -->|"requests pages"| node_routes
node_routes -->|"dispatches"| node_home_ctl
node_routes -->|"dispatches"| node_project_ctl
node_routes -->|"dispatches"| node_contact_ctl
node_routes -->|"dispatches"| node_github_ctl
node_home_ctl -->|"loads stats"| node_github_service
node_home_ctl -->|"renders"| node_home_page
node_home_ctl -->|"reads portfolio data"| node_content_config
node_home_ctl -->|"reads project data"| node_project_config
node_project_ctl -->|"reads project data"| node_project_config
node_project_ctl -->|"renders detail"| node_project_detail
node_project_ctl -->|"renders index"| node_project_pages
node_about_ctl -->|"loads stats"| node_github_service
node_react_app -->|"mounts"| node_root_layout
node_root_layout -.->|"not evidenced"| node_github_panel
node_github_panel -->|"reads stats"| node_github_hook
node_contact_ctl -->|"validates submission"| node_contact_request
node_contact_ctl -->|"creates message"| node_contact_model
node_contact_ctl -->|"sends notification"| node_contact_notice
node_github_ctl -->|"handles stats and webhook"| node_github_service
node_github_service -->|"requests profile and activity"| node_github_api
node_app_boot -->|"registers routes"| node_routes
node_app_boot -->|"appends middleware"| node_inertia_middleware
node_react_app -.->|"entry relationship unverified"| node_blade_shell

click node_routes "https://github.com/rbarcoma/my-portfolio/blob/main/routes/web.php"
click node_home_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/HomeController.php"
click node_project_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ProjectController.php"
click node_about_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/AboutController.php"
click node_experience_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ExperienceController.php"
click node_skills_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/SkillsController.php"
click node_cv_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/CvController.php"
click node_content_config "https://github.com/rbarcoma/my-portfolio/blob/main/config/portfolio.php"
click node_project_config "https://github.com/rbarcoma/my-portfolio/blob/main/config/projects.php"
click node_home_page "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Home.jsx"
click node_project_pages "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Projects/Index.jsx"
click node_about_page "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/About.jsx"
click node_experience_page "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Experience.jsx"
click node_skills_page "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Skills.jsx"
click node_contact_page "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Contact.jsx"
click node_project_detail "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Projects/Show.jsx"
click node_react_app "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/app.jsx"
click node_root_layout "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Layouts/RootLayout.jsx"
click node_github_panel "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Components/sections/GitHubPanel.jsx"
click node_github_hook "https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/hooks/useGithubStats.js"
click node_contact_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ContactController.php"
click node_contact_request "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Requests/StoreContactMessageRequest.php"
click node_contact_model "https://github.com/rbarcoma/my-portfolio/blob/main/app/Models/ContactMessage.php"
click node_contact_notice "https://github.com/rbarcoma/my-portfolio/blob/main/app/Notifications/ContactMessageReceived.php"
click node_github_ctl "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/GithubController.php"
click node_github_service "https://github.com/rbarcoma/my-portfolio/blob/main/app/Services/GitHubService.php"
click node_inertia_middleware "https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Middleware/HandleInertiaRequests.php"
click node_app_boot "https://github.com/rbarcoma/my-portfolio/blob/main/bootstrap/app.php"
click node_blade_shell "https://github.com/rbarcoma/my-portfolio/blob/main/resources/views/app.blade.php"

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_page,node_project_pages,node_about_page,node_experience_page,node_skills_page,node_contact_page,node_project_detail,node_react_app,node_root_layout toneBlue
class node_home_ctl,node_project_ctl,node_about_ctl,node_experience_ctl,node_skills_ctl,node_cv_ctl,node_content_config,node_project_config toneAmber
class node_contact_ctl,node_contact_request,node_contact_model,node_contact_notice,node_github_api toneMint
class node_github_panel,node_github_hook,node_github_ctl,node_github_service toneRose
class node_routes,node_inertia_middleware,node_app_boot,node_blade_shell,node_visitor toneIndigo
```

## Components

### Web presentation

- [Home page](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Home.jsx): `resources/js/Pages/Home.jsx`
- [Project pages](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Projects/Index.jsx): `resources/js/Pages/Projects/Index.jsx`
- [About page](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/About.jsx): `resources/js/Pages/About.jsx`
- [Experience page](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Experience.jsx): `resources/js/Pages/Experience.jsx`
- [Skills page](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Skills.jsx): `resources/js/Pages/Skills.jsx`
- [Contact page](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Contact.jsx): `resources/js/Pages/Contact.jsx`
- [Project detail](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Pages/Projects/Show.jsx): `resources/js/Pages/Projects/Show.jsx`
- [Inertia React app](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/app.jsx): `resources/js/app.jsx`
- [Root layout](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Layouts/RootLayout.jsx): `resources/js/Layouts/RootLayout.jsx`

### Portfolio content

- [Home controller](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/HomeController.php): `app/Http/Controllers/HomeController.php`
- [Project controller](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ProjectController.php): `app/Http/Controllers/ProjectController.php`
- [About controller](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/AboutController.php): `app/Http/Controllers/AboutController.php`
- [Experience controller](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ExperienceController.php): `app/Http/Controllers/ExperienceController.php`
- [Skills controller](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/SkillsController.php): `app/Http/Controllers/SkillsController.php`
- [CV controller](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/CvController.php): `app/Http/Controllers/CvController.php`
- [Portfolio data](https://github.com/rbarcoma/my-portfolio/blob/main/config/portfolio.php): `config/portfolio.php`
- [Project data](https://github.com/rbarcoma/my-portfolio/blob/main/config/projects.php): `config/projects.php`

### Contact workflow

- [Contact controller](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/ContactController.php): `app/Http/Controllers/ContactController.php`
- [Contact validation](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Requests/StoreContactMessageRequest.php): `app/Http/Requests/StoreContactMessageRequest.php`
- [Contact messages](https://github.com/rbarcoma/my-portfolio/blob/main/app/Models/ContactMessage.php): `app/Models/ContactMessage.php`
- [Contact notification](https://github.com/rbarcoma/my-portfolio/blob/main/app/Notifications/ContactMessageReceived.php): `app/Notifications/ContactMessageReceived.php`

### GitHub integration

- [GitHub panel](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/Components/sections/GitHubPanel.jsx): `resources/js/Components/sections/GitHubPanel.jsx`
- [GitHub stats hook](https://github.com/rbarcoma/my-portfolio/blob/main/resources/js/hooks/useGithubStats.js): `resources/js/hooks/useGithubStats.js`
- [GitHub endpoints](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Controllers/GithubController.php): `app/Http/Controllers/GithubController.php`
- [GitHub service](https://github.com/rbarcoma/my-portfolio/blob/main/app/Services/GitHubService.php): `app/Services/GitHubService.php`

### Laravel runtime

- [Web routes](https://github.com/rbarcoma/my-portfolio/blob/main/routes/web.php): `routes/web.php`
- [Inertia middleware](https://github.com/rbarcoma/my-portfolio/blob/main/app/Http/Middleware/HandleInertiaRequests.php): `app/Http/Middleware/HandleInertiaRequests.php`
- [Application bootstrap](https://github.com/rbarcoma/my-portfolio/blob/main/bootstrap/app.php): `bootstrap/app.php`
- [HTML shell](https://github.com/rbarcoma/my-portfolio/blob/main/resources/views/app.blade.php): `resources/views/app.blade.php`

### Other components

- **Visitor**
- **GitHub API**

## Connections

- Visitor → Web routes: requests pages (evidence: `routes/web.php`)
- Web routes → Home controller: dispatches (evidence: `routes/web.php`)
- Web routes → Project controller: dispatches (evidence: `routes/web.php`)
- Web routes → Contact controller: dispatches (evidence: `routes/web.php`)
- Web routes → GitHub endpoints: dispatches (evidence: `routes/web.php`)
- Home controller → GitHub service: loads stats (evidence: `app/Http/Controllers/HomeController.php`)
- Home controller → Home page: renders (evidence: `app/Http/Controllers/HomeController.php`)
- Home controller → Portfolio data: reads portfolio data (evidence: `app/Http/Controllers/HomeController.php`)
- Home controller → Project data: reads project data (evidence: `app/Http/Controllers/HomeController.php`)
- Project controller → Project data: reads project data (evidence: `app/Http/Controllers/ProjectController.php`)
- Project controller → Project detail: renders detail (evidence: `app/Http/Controllers/ProjectController.php`)
- Project controller → Project pages: renders index (evidence: `app/Http/Controllers/ProjectController.php`)
- About controller → GitHub service: loads stats (evidence: `app/Http/Controllers/AboutController.php`)
- Inertia React app → Root layout: mounts (evidence: `resources/js/app.jsx`)
- Root layout → GitHub panel: not evidenced
- GitHub panel → GitHub stats hook: reads stats (evidence: `resources/js/Components/sections/GitHubPanel.jsx`)
- Contact controller → Contact validation: validates submission (evidence: `app/Http/Controllers/ContactController.php`)
- Contact controller → Contact messages: creates message (evidence: `app/Http/Controllers/ContactController.php`)
- Contact controller → Contact notification: sends notification (evidence: `app/Http/Controllers/ContactController.php`)
- GitHub endpoints → GitHub service: handles stats and webhook (evidence: `app/Http/Controllers/GithubController.php`)
- GitHub service → GitHub API: requests profile and activity (evidence: `app/Services/GitHubService.php`)
- Application bootstrap → Web routes: registers routes (evidence: `bootstrap/app.php`)
- Application bootstrap → Inertia middleware: appends middleware (evidence: `bootstrap/app.php`)
- Inertia React app → HTML shell: entry relationship unverified
