# boredmayonnaise/virtus-website architecture

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

- Interactive diagram: https://gitdiagram.com/boredmayonnaise/virtus-website
- Repository: https://github.com/boredmayonnaise/virtus-website

## Overview

This is a creative-agency site paired with an operations workspace and client portal. The main supported flow is public inquiry submission: the brief API applies rate limits, calculates a quote, and records an opportunity. Staff-facing operations, client project review, and public tracking are distinct product areas. The source index establishes several route-to-service dependencies, but many page and route implementations were not sampled, so those links are omitted rather than inferred.

Main entry points: [`src/lib/clientPortal.ts`](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/clientPortal.ts) (Portal services), [`src/app/api/brief/route.ts`](https://github.com/boredmayonnaise/virtus-website/blob/main/src/app/api/brief/route.ts) (Inquiry submission), [`src/components/client/ClientDashboard.tsx`](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/client/ClientDashboard.tsx) (Client dashboard), [`src/db/index.ts`](https://github.com/boredmayonnaise/virtus-website/blob/main/src/db/index.ts) (Agency data store)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public site"]
  node_brief["Inquiry submission<br/>[route.ts]"]
  node_quote["Quote calculation<br/>[quotationEngine.ts]"]
  node_sitecontent["Site content<br/>[siteData.ts]"]
end

subgraph group_operations["Agency operations"]
  node_opsui["Operations workspace"]
  node_pipeline["Pipeline view<br/>[PipelineView.tsx]"]
  node_clientsview["Client management<br/>[ClientsView.tsx]"]
  node_projects["Projects and tasks"]
  node_accounting["Accounting and invoices<br/>[AccountingView.tsx]"]
  node_contracts["Contracts<br/>[ContractsView.tsx]"]
  node_otherops["Other operations"]
end

subgraph group_portal["Client portal"]
  node_clientdashboard["Client dashboard"]
  node_revision["Revision requests<br/>[RevisionDialog.tsx]"]
  node_portalapi["Portal API"]
  node_tracking["Project tracking<br/>[route.ts]"]
  node_dashboardui["Dashboard UI helpers"]
end

subgraph group_platform["Application services"]
  node_appdata[("Agency data store<br/>[index.ts]")]
  node_portalservice["Portal services<br/>[clientPortal.ts]"]
  node_staffauth["Staff authentication<br/>[staffAuth.ts]"]
  node_staffstore[("Staff accounts<br/>[staffStore.ts]")]
  node_sessions["Signed sessions<br/>[session.ts]"]
  node_settings[("Settings storage<br/>[settingsStore.ts]")]
  node_tokens["Portal tokens<br/>[tokens.ts]"]
  node_neon[("Neon database access<br/>[neon.ts]")]
  node_ratelimit["Rate limiting<br/>[rateLimit.ts]"]
  node_apiutil["API helpers<br/>[apiUtil.ts]"]
  node_icons["Shared icon set<br/>[Icon.tsx]"]
end

node_visitor(("Visitor"))
node_staff(("Agency staff"))
node_client(("Agency client"))

node_visitor -->|"submits inquiry"| node_brief
node_brief -->|"checks limits"| node_ratelimit
node_brief -->|"calculates quote"| node_quote
node_brief -->|"records opportunity"| node_appdata
node_staff -.->|"uses workspace"| node_opsui
node_client -.->|"reviews project"| node_clientdashboard
node_clientdashboard -->|"uses portal data"| node_portalservice
node_clientdashboard -->|"opens revisions"| node_revision
node_clientdashboard -->|"renders dashboard"| node_dashboardui
node_revision -->|"renders icons"| node_icons
node_portalapi -->|"uses portal services"| node_portalservice
node_portalapi -->|"checks limits"| node_ratelimit
node_portalservice -->|"uses agency data"| node_appdata
node_portalservice -->|"checks demo access"| node_settings
node_portalservice -->|"issues and verifies"| node_tokens
node_portalservice -->|"queries database"| node_neon
node_staffauth -->|"verifies sessions"| node_sessions
node_staffauth -->|"loads staff account"| node_staffstore
node_staffauth -->|"checks invite settings"| node_settings
node_pipeline -->|"uses data store"| node_appdata
node_clientsview -->|"uses data store"| node_appdata
node_tracking -->|"checks limits"| node_ratelimit
node_tracking -.->|"updates tracking view"| node_opsui

click node_brief "https://github.com/boredmayonnaise/virtus-website/blob/main/src/app/api/brief/route.ts"
click node_quote "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/quotationEngine.ts"
click node_sitecontent "https://github.com/boredmayonnaise/virtus-website/blob/main/src/data/siteData.ts"
click node_opsui "https://github.com/boredmayonnaise/virtus-website/tree/main/src/components/dashboard"
click node_pipeline "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/PipelineView.tsx"
click node_clientsview "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/ClientsView.tsx"
click node_projects "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/ProjectsTasksView.tsx"
click node_accounting "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/AccountingView.tsx"
click node_contracts "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/ContractsView.tsx"
click node_otherops "https://github.com/boredmayonnaise/virtus-website/tree/main/src/components/dashboard"
click node_clientdashboard "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/client/ClientDashboard.tsx"
click node_revision "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/client/RevisionDialog.tsx"
click node_portalapi "https://github.com/boredmayonnaise/virtus-website/tree/main/src/app/api/client"
click node_tracking "https://github.com/boredmayonnaise/virtus-website/blob/main/src/app/api/track/route.ts"
click node_appdata "https://github.com/boredmayonnaise/virtus-website/blob/main/src/db/index.ts"
click node_portalservice "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/clientPortal.ts"
click node_staffauth "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/staffAuth.ts"
click node_staffstore "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/staffStore.ts"
click node_sessions "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/session.ts"
click node_settings "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/settingsStore.ts"
click node_tokens "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/tokens.ts"
click node_neon "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/neon.ts"
click node_ratelimit "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/rateLimit.ts"
click node_apiutil "https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/apiUtil.ts"
click node_icons "https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/icons/Icon.tsx"
click node_dashboardui "https://github.com/boredmayonnaise/virtus-website/tree/main/src/components/client/dashboard"

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_brief,node_quote,node_sitecontent,node_client toneBlue
class node_opsui,node_pipeline,node_clientsview,node_projects,node_accounting,node_contracts,node_otherops toneAmber
class node_clientdashboard,node_revision,node_portalapi,node_tracking,node_dashboardui toneMint
class node_appdata,node_portalservice,node_staffauth,node_staffstore,node_sessions,node_settings,node_tokens,node_neon,node_ratelimit,node_apiutil,node_icons toneRose
class node_visitor,node_staff toneIndigo
```

## Components

### Public site

- [Inquiry submission](https://github.com/boredmayonnaise/virtus-website/blob/main/src/app/api/brief/route.ts): `src/app/api/brief/route.ts`
- [Quote calculation](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/quotationEngine.ts): `src/lib/quotationEngine.ts`
- [Site content](https://github.com/boredmayonnaise/virtus-website/blob/main/src/data/siteData.ts): `src/data/siteData.ts`

### Agency operations

- [Operations workspace](https://github.com/boredmayonnaise/virtus-website/tree/main/src/components/dashboard): `src/components/dashboard`
- [Pipeline view](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/PipelineView.tsx): `src/components/dashboard/PipelineView.tsx`
- [Client management](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/ClientsView.tsx): `src/components/dashboard/ClientsView.tsx`
- [Projects and tasks](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/ProjectsTasksView.tsx): `src/components/dashboard/ProjectsTasksView.tsx`
- [Accounting and invoices](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/AccountingView.tsx): `src/components/dashboard/AccountingView.tsx`
- [Contracts](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/dashboard/ContractsView.tsx): `src/components/dashboard/ContractsView.tsx`
- [Other operations](https://github.com/boredmayonnaise/virtus-website/tree/main/src/components/dashboard): `src/components/dashboard`

### Client portal

- [Client dashboard](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/client/ClientDashboard.tsx): `src/components/client/ClientDashboard.tsx`
- [Revision requests](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/client/RevisionDialog.tsx): `src/components/client/RevisionDialog.tsx`
- [Portal API](https://github.com/boredmayonnaise/virtus-website/tree/main/src/app/api/client): `src/app/api/client`
- [Project tracking](https://github.com/boredmayonnaise/virtus-website/blob/main/src/app/api/track/route.ts): `src/app/api/track/route.ts`
- [Dashboard UI helpers](https://github.com/boredmayonnaise/virtus-website/tree/main/src/components/client/dashboard): `src/components/client/dashboard`

### Application services

- [Agency data store](https://github.com/boredmayonnaise/virtus-website/blob/main/src/db/index.ts): `src/db/index.ts`
- [Portal services](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/clientPortal.ts): `src/lib/clientPortal.ts`
- [Staff authentication](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/staffAuth.ts): `src/lib/staffAuth.ts`
- [Staff accounts](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/staffStore.ts): `src/lib/staffStore.ts`
- [Signed sessions](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/session.ts): `src/lib/session.ts`
- [Settings storage](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/settingsStore.ts): `src/lib/settingsStore.ts`
- [Portal tokens](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/tokens.ts): `src/lib/tokens.ts`
- [Neon database access](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/neon.ts): `src/lib/neon.ts`
- [Rate limiting](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/rateLimit.ts): `src/lib/rateLimit.ts`
- [API helpers](https://github.com/boredmayonnaise/virtus-website/blob/main/src/lib/apiUtil.ts): `src/lib/apiUtil.ts`
- [Shared icon set](https://github.com/boredmayonnaise/virtus-website/blob/main/src/components/icons/Icon.tsx): `src/components/icons/Icon.tsx`

### Other components

- **Visitor**
- **Agency staff**
- **Agency client**

## Connections

- Visitor → Inquiry submission: submits inquiry (evidence: `src/app/api/brief/route.ts`)
- Inquiry submission → Rate limiting: checks limits (evidence: `src/app/api/brief/route.ts`)
- Inquiry submission → Quote calculation: calculates quote (evidence: `src/app/api/brief/route.ts`)
- Inquiry submission → Agency data store: records opportunity (evidence: `src/app/api/brief/route.ts`)
- Agency staff → Operations workspace: uses workspace
- Agency client → Client dashboard: reviews project
- Client dashboard → Portal services: uses portal data (evidence: `src/components/client/ClientDashboard.tsx`)
- Client dashboard → Revision requests: opens revisions (evidence: `src/components/client/ClientDashboard.tsx`)
- Client dashboard → Dashboard UI helpers: renders dashboard (evidence: `src/components/client/ClientDashboard.tsx`)
- Revision requests → Shared icon set: renders icons (evidence: `src/components/client/RevisionDialog.tsx`)
- Portal API → Portal services: uses portal services (evidence: `src/app/api/client/revisions/route.ts`)
- Portal API → Rate limiting: checks limits (evidence: `src/app/api/client/revisions/route.ts`)
- Portal services → Agency data store: uses agency data (evidence: `src/lib/clientPortal.ts`)
- Portal services → Settings storage: checks demo access (evidence: `src/lib/clientPortal.ts`)
- Portal services → Portal tokens: issues and verifies (evidence: `src/lib/clientPortal.ts`)
- Portal services → Neon database access: queries database (evidence: `src/lib/clientPortal.ts`)
- Staff authentication → Signed sessions: verifies sessions (evidence: `src/lib/staffAuth.ts`)
- Staff authentication → Staff accounts: loads staff account (evidence: `src/lib/staffAuth.ts`)
- Staff authentication → Settings storage: checks invite settings (evidence: `src/lib/staffAuth.ts`)
- Pipeline view → Agency data store: uses data store (evidence: `src/components/dashboard/PipelineView.tsx`)
- Client management → Agency data store: uses data store
- Project tracking → Rate limiting: checks limits (evidence: `src/app/api/track/route.ts`)
- Project tracking → Operations workspace: updates tracking view
