# kerevizodunu2000/rosu-web architecture

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

- Interactive diagram: https://gitdiagram.com/kerevizodunu2000/rosu-web
- Repository: https://github.com/kerevizodunu2000/rosu-web

## Overview

Rosu-web is the marketing site and report-management backend for the Rosu desktop app. Its main workflow accepts reports from either the web form or desktop client, validates and rate-limits them, stores report records and optional screenshots, then archives pending reports and images to Drive. Admins authenticate to review submissions, retrieve protected images, and trigger archives. The archive job and several UI/API modules were not sampled, so those links follow documented capabilities and route names; implementation details beyond that are not inferred.

Main entry points: [`app/api/report/route.ts`](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/report/route.ts) (Report endpoint), [`lib/archiveJob.ts`](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/archiveJob.ts) (Archive job), [`app/admin/page.tsx`](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/admin/page.tsx) (Admin submissions), [`lib/reportService.ts`](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/reportService.ts) (Report handling)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_site["Public website"]
  node_landing["Landing page<br/>[page.tsx]"]
  node_reportpage["Report page<br/>[page.tsx]"]
  node_policies["Privacy and terms<br/>[page.tsx]"]
  node_reportform["Report form<br/>[ReportForm.tsx]"]
end

subgraph group_reporting["Report intake"]
  node_reportroute["Report endpoint<br/>[route.ts]"]
  node_reportservice["Report handling<br/>[reportService.ts]"]
  node_validation["Input validation<br/>[validation.ts]"]
  node_ratelimit["Rate limiting<br/>[ratelimit.ts]"]
end

subgraph group_archive["Archive processing"]
  node_drivemodule["Drive client<br/>[drive.ts]"]
  node_archivejob["Archive job<br/>[archiveJob.ts]"]
  node_archiveservice["Archive assembly<br/>[archiveService.ts]"]
  node_zip["ZIP builder<br/>[zip.ts]"]
end

subgraph group_admin["Admin operations"]
  node_adminpage["Admin submissions<br/>[page.tsx]"]
  node_admintable["Submissions table<br/>[AdminTable.tsx]"]
  node_loginroute["Admin login<br/>[route.ts]"]
  node_archiveroute["Manual archive<br/>[route.ts]"]
  node_imageroute["Protected image proxy<br/>[route.ts]"]
  node_session["Session handling<br/>[session.ts]"]
end

node_visitor(("Site visitor"))
node_desktop(("Rosu desktop app"))
node_turnstile{{"Turnstile"}}
node_neon[("Neon report store")]
node_drive[("Google Drive")]
node_cron(("Scheduled archive"))

node_visitor -->|"views"| node_landing
node_visitor -->|"opens"| node_reportpage
node_reportpage -->|"renders"| node_reportform
node_visitor -->|"submits"| node_reportform
node_reportform -->|"POSTs report"| node_reportroute
node_desktop -->|"POSTs report"| node_reportroute
node_reportroute -->|"handles report"| node_reportservice
node_reportservice -->|"validates"| node_validation
node_reportservice -.->|"verifies web token"| node_turnstile
node_reportservice -->|"checks limits"| node_ratelimit
node_reportroute -->|"stores report and limits"| node_neon
node_reportroute -->|"uploads screenshot"| node_drivemodule
node_drivemodule -->|"stores image"| node_drive
node_cron -->|"triggers daily"| node_archivejob
node_reportroute -->|"triggers threshold archive"| node_archivejob
node_archiveroute -->|"triggers manual archive"| node_archivejob
node_archivejob -->|"runs archive"| node_archiveservice
node_archiveservice -->|"builds archive"| node_zip
node_archivejob -->|"reads and marks reports"| node_neon
node_archivejob -->|"moves images and archive"| node_drivemodule
node_adminpage -->|"shows submissions"| node_admintable
node_adminpage -->|"authenticates"| node_loginroute
node_loginroute -->|"creates session"| node_session
node_adminpage -->|"requests archive"| node_archiveroute
node_archiveroute -->|"verifies session"| node_session
node_adminpage -->|"requests image"| node_imageroute
node_imageroute -->|"verifies session"| node_session
node_imageroute -->|"looks up image record"| node_neon
node_imageroute -->|"downloads image"| node_drivemodule

click node_landing "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/(site)/page.tsx"
click node_reportpage "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/(site)/report/page.tsx"
click node_policies "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/(site)/privacy/page.tsx"
click node_reportform "https://github.com/kerevizodunu2000/rosu-web/blob/main/components/ReportForm.tsx"
click node_reportroute "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/report/route.ts"
click node_reportservice "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/reportService.ts"
click node_validation "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/validation.ts"
click node_ratelimit "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/ratelimit.ts"
click node_drivemodule "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/drive.ts"
click node_archivejob "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/archiveJob.ts"
click node_archiveservice "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/archiveService.ts"
click node_zip "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/zip.ts"
click node_adminpage "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/admin/page.tsx"
click node_admintable "https://github.com/kerevizodunu2000/rosu-web/blob/main/components/AdminTable.tsx"
click node_loginroute "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/admin/login/route.ts"
click node_archiveroute "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/admin/archive/route.ts"
click node_imageroute "https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/admin/image/%5Bid%5D/route.ts"
click node_session "https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/session.ts"

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_landing,node_reportpage,node_policies,node_reportform toneBlue
class node_reportroute,node_reportservice,node_validation,node_ratelimit,node_neon,node_drive toneAmber
class node_drivemodule,node_archivejob,node_archiveservice,node_zip toneMint
class node_adminpage,node_admintable,node_loginroute,node_archiveroute,node_imageroute,node_session toneRose
class node_visitor,node_desktop,node_turnstile,node_cron toneIndigo
```

## Components

### Public website

- [Landing page](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/(site)/page.tsx): `app/(site)/page.tsx`
- [Report page](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/(site)/report/page.tsx): `app/(site)/report/page.tsx`
- [Privacy and terms](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/(site)/privacy/page.tsx): `app/(site)/privacy/page.tsx`
- [Report form](https://github.com/kerevizodunu2000/rosu-web/blob/main/components/ReportForm.tsx): `components/ReportForm.tsx`

### Report intake

- [Report endpoint](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/report/route.ts): `app/api/report/route.ts`
- [Report handling](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/reportService.ts): `lib/reportService.ts`
- [Input validation](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/validation.ts): `lib/validation.ts`
- [Rate limiting](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/ratelimit.ts): `lib/ratelimit.ts`

### Archive processing

- [Drive client](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/drive.ts): `lib/drive.ts`
- [Archive job](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/archiveJob.ts): `lib/archiveJob.ts`
- [Archive assembly](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/archiveService.ts): `lib/archiveService.ts`
- [ZIP builder](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/zip.ts): `lib/zip.ts`

### Admin operations

- [Admin submissions](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/admin/page.tsx): `app/admin/page.tsx`
- [Submissions table](https://github.com/kerevizodunu2000/rosu-web/blob/main/components/AdminTable.tsx): `components/AdminTable.tsx`
- [Admin login](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/admin/login/route.ts): `app/api/admin/login/route.ts`
- [Manual archive](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/admin/archive/route.ts): `app/api/admin/archive/route.ts`
- [Protected image proxy](https://github.com/kerevizodunu2000/rosu-web/blob/main/app/api/admin/image/%5Bid%5D/route.ts): `app/api/admin/image/[id]/route.ts`
- [Session handling](https://github.com/kerevizodunu2000/rosu-web/blob/main/lib/session.ts): `lib/session.ts`

### Other components

- **Site visitor**
- **Rosu desktop app**
- **Turnstile**
- **Neon report store**
- **Google Drive**
- **Scheduled archive**

## Connections

- Site visitor → Landing page: views
- Site visitor → Report page: opens
- Report page → Report form: renders
- Site visitor → Report form: submits
- Report form → Report endpoint: POSTs report
- Rosu desktop app → Report endpoint: POSTs report
- Report endpoint → Report handling: handles report
- Report handling → Input validation: validates
- Report handling → Turnstile: verifies web token
- Report handling → Rate limiting: checks limits
- Report endpoint → Neon report store: stores report and limits
- Report endpoint → Drive client: uploads screenshot
- Drive client → Google Drive: stores image
- Scheduled archive → Archive job: triggers daily
- Report endpoint → Archive job: triggers threshold archive
- Manual archive → Archive job: triggers manual archive
- Archive job → Archive assembly: runs archive
- Archive assembly → ZIP builder: builds archive
- Archive job → Neon report store: reads and marks reports
- Archive job → Drive client: moves images and archive
- Admin submissions → Submissions table: shows submissions
- Admin submissions → Admin login: authenticates
- Admin login → Session handling: creates session
- Admin submissions → Manual archive: requests archive
- Manual archive → Session handling: verifies session
- Admin submissions → Protected image proxy: requests image
- Protected image proxy → Session handling: verifies session
- Protected image proxy → Neon report store: looks up image record
- Protected image proxy → Drive client: downloads image
