# jose-franco22/teamup architecture

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

- Interactive diagram: https://gitdiagram.com/jose-franco22/teamup
- Repository: https://github.com/jose-franco22/teamup

## Overview

TeamUp is a student team-formation platform: students browse projects and compare needed roles with their skills, send join requests, and project creators accept or decline applicants to build a roster. Profiles capture skills and availability; the README also describes resume parsing and recommendations, though those capabilities are not fully evidenced in the sampled frontend. The visible app currently uses mock data by default and can call an Express API. The tree contains no backend source, so backend behavior and persistence are not mapped as implemented.

Main entry points: [`frontend/src/App.jsx`](https://github.com/jose-franco22/teamup/blob/main/frontend/src/App.jsx) (Routes and navigation), [`frontend/src/api/client.js`](https://github.com/jose-franco22/teamup/blob/main/frontend/src/api/client.js) (API client), [`frontend/src/pages/Browse.jsx`](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Browse.jsx) (Browse projects), [`frontend/src/pages/Profile.jsx`](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Profile.jsx) (Student profile)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Frontend app"]
  node_entry["App entry<br/>[main.jsx]"]
  node_router["Routes and navigation<br/>[App.jsx]"]
  node_landing["Landing<br/>[Landing.jsx]"]
  node_async["Async loading<br/>[useAsync.js]"]
end

subgraph group_formation["Team formation"]
  node_browse["Browse projects<br/>[Browse.jsx]"]
  node_postings["Project postings"]
  node_matching["Skill matching<br/>[mockData.js]"]
  node_requests["Join requests<br/>[Requests.jsx]"]
  node_team["Team roster<br/>[Team.jsx]"]
end

subgraph group_identity["Profiles and auth"]
  node_profile["Student profile<br/>[Profile.jsx]"]
  node_resume["Resume parsing<br/>[Profile.jsx]"]
  node_login["Sign-in screen<br/>[Login.jsx]"]
  node_session["Session context<br/>[SessionContext.jsx]"]
  node_routeguard["Protected routes<br/>[ProtectedRoute.jsx]"]
end

subgraph group_data["API and data"]
  node_client["API client<br/>[client.js]"]
  node_mock[("Mock records<br/>[mockData.js]")]
end

node_student(("Student"))
node_api["Express API"]
node_gemini["Gemini extraction"]
node_postgres[("PostgreSQL")]

node_student -->|"opens app"| node_entry
node_entry -->|"renders"| node_router
node_router -->|"routes to"| node_landing
node_router -->|"routes to"| node_login
node_router -->|"routes to"| node_browse
node_router -->|"routes to"| node_profile
node_router -->|"routes to"| node_requests
node_router -->|"routes to"| node_team
node_router -->|"guards"| node_routeguard
node_routeguard -->|"checks session"| node_session
node_login -->|"signs in"| node_session
node_session -->|"sets session identity"| node_client
node_browse -->|"loads projects"| node_client
node_browse -->|"filters by skills"| node_matching
node_browse -->|"sends join request"| node_client
node_profile -->|"reads and updates profile"| node_client
node_profile -.->|"offers import"| node_resume
node_resume -.->|"would extract skills"| node_gemini
node_requests -->|"loads and responds"| node_client
node_team -->|"loads roster"| node_client
node_browse -->|"browses listings"| node_postings
node_client -->|"reads and mutates"| node_mock
node_client -.->|"fetches endpoints"| node_api
node_api -.->|"would persist"| node_postgres
node_browse -->|"loads asynchronously"| node_async
node_profile -->|"loads asynchronously"| node_async
node_requests -->|"loads asynchronously"| node_async
node_team -->|"loads asynchronously"| node_async

click node_entry "https://github.com/jose-franco22/teamup/blob/main/frontend/src/main.jsx"
click node_router "https://github.com/jose-franco22/teamup/blob/main/frontend/src/App.jsx"
click node_landing "https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Landing.jsx"
click node_browse "https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Browse.jsx"
click node_postings "https://github.com/jose-franco22/teamup/tree/main/frontend/src/pages"
click node_matching "https://github.com/jose-franco22/teamup/blob/main/frontend/src/api/mockData.js"
click node_requests "https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Requests.jsx"
click node_team "https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Team.jsx"
click node_profile "https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Profile.jsx"
click node_resume "https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Profile.jsx"
click node_login "https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Login.jsx"
click node_session "https://github.com/jose-franco22/teamup/blob/main/frontend/src/auth/SessionContext.jsx"
click node_routeguard "https://github.com/jose-franco22/teamup/blob/main/frontend/src/auth/ProtectedRoute.jsx"
click node_client "https://github.com/jose-franco22/teamup/blob/main/frontend/src/api/client.js"
click node_mock "https://github.com/jose-franco22/teamup/blob/main/frontend/src/api/mockData.js"
click node_async "https://github.com/jose-franco22/teamup/blob/main/frontend/src/components/useAsync.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_entry,node_router,node_landing,node_async toneBlue
class node_browse,node_postings,node_matching,node_requests,node_team,node_postgres toneAmber
class node_profile,node_resume,node_login,node_session,node_routeguard,node_api toneMint
class node_client,node_mock toneRose
class node_student,node_gemini toneIndigo
```

## Components

### Frontend app

- [App entry](https://github.com/jose-franco22/teamup/blob/main/frontend/src/main.jsx): `frontend/src/main.jsx`
- [Routes and navigation](https://github.com/jose-franco22/teamup/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Landing](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Landing.jsx): `frontend/src/pages/Landing.jsx`
- [Async loading](https://github.com/jose-franco22/teamup/blob/main/frontend/src/components/useAsync.js): `frontend/src/components/useAsync.js`

### Team formation

- [Browse projects](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Browse.jsx): `frontend/src/pages/Browse.jsx`
- [Project postings](https://github.com/jose-franco22/teamup/tree/main/frontend/src/pages): `frontend/src/pages`
- [Skill matching](https://github.com/jose-franco22/teamup/blob/main/frontend/src/api/mockData.js): `frontend/src/api/mockData.js`
- [Join requests](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Requests.jsx): `frontend/src/pages/Requests.jsx`
- [Team roster](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Team.jsx): `frontend/src/pages/Team.jsx`

### Profiles and auth

- [Student profile](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Profile.jsx): `frontend/src/pages/Profile.jsx`
- [Resume parsing](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Profile.jsx): `frontend/src/pages/Profile.jsx`
- [Sign-in screen](https://github.com/jose-franco22/teamup/blob/main/frontend/src/pages/Login.jsx): `frontend/src/pages/Login.jsx`
- [Session context](https://github.com/jose-franco22/teamup/blob/main/frontend/src/auth/SessionContext.jsx): `frontend/src/auth/SessionContext.jsx`
- [Protected routes](https://github.com/jose-franco22/teamup/blob/main/frontend/src/auth/ProtectedRoute.jsx): `frontend/src/auth/ProtectedRoute.jsx`

### API and data

- [API client](https://github.com/jose-franco22/teamup/blob/main/frontend/src/api/client.js): `frontend/src/api/client.js`
- [Mock records](https://github.com/jose-franco22/teamup/blob/main/frontend/src/api/mockData.js): `frontend/src/api/mockData.js`

### Other components

- **Student**
- **Express API**
- **Gemini extraction**
- **PostgreSQL**

## Connections

- Student → App entry: opens app
- App entry → Routes and navigation: renders
- Routes and navigation → Landing: routes to
- Routes and navigation → Sign-in screen: routes to
- Routes and navigation → Browse projects: routes to
- Routes and navigation → Student profile: routes to
- Routes and navigation → Join requests: routes to
- Routes and navigation → Team roster: routes to
- Routes and navigation → Protected routes: guards
- Protected routes → Session context: checks session
- Sign-in screen → Session context: signs in
- Session context → API client: sets session identity
- Browse projects → API client: loads projects
- Browse projects → Skill matching: filters by skills
- Browse projects → API client: sends join request
- Student profile → API client: reads and updates profile
- Student profile → Resume parsing: offers import
- Resume parsing → Gemini extraction: would extract skills
- Join requests → API client: loads and responds
- Team roster → API client: loads roster
- Browse projects → Project postings: browses listings
- API client → Mock records: reads and mutates
- API client → Express API: fetches endpoints
- Express API → PostgreSQL: would persist
- Browse projects → Async loading: loads asynchronously
- Student profile → Async loading: loads asynchronously
- Join requests → Async loading: loads asynchronously
- Team roster → Async loading: loads asynchronously
