# granted07/genu-website architecture

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

- Interactive diagram: https://gitdiagram.com/granted07/genu-website
- Repository: https://github.com/granted07/genu-website

## Overview

Generation Uprising is an editorial publishing site with public article collections and detail pages, a Hall of Noise audio section, team and sponsor pages, and an admin content workspace. The main reader workflow is browsing a collection, selecting an article, and viewing its rendered detail; collection data is served through preview APIs and shared caching. Admin routes authenticate requests and manage content, including Hall of Noise uploads. The graph follows explicit imports, sampled calls, and documented product pages; several unsampled routes and page-to-component links are not inferred.

Main entry points: [`lib/supabase.ts`](https://github.com/granted07/genu-website/blob/master/lib/supabase.ts) (Supabase access), [`lib/admin-auth.ts`](https://github.com/granted07/genu-website/blob/master/lib/admin-auth.ts) (Admin authorization), [`app/case-files/page.tsx`](https://github.com/granted07/genu-website/blob/master/app/case-files/page.tsx) (Collection pages), [`app/api/hall-of-noise/route.ts`](https://github.com/granted07/genu-website/blob/master/app/api/hall-of-noise/route.ts) (Public audio API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_reader["Public publishing"]
  node_collection_pages["Collection pages<br/>[page.tsx]"]
  node_collection_ui["Collection interface"]
  node_casefile_ui["Case file interface"]
  node_article_pages["Article pages<br/>[page.tsx]"]
  node_article_view["Article renderer<br/>[article-page.tsx]"]
  node_markdown["Markdown renderer"]
  node_team_page["Team page<br/>[page.tsx]"]
  node_team_roster["Team roster"]
  node_team_core["Team visual<br/>[team-core.tsx]"]
end

subgraph group_audio["Hall of Noise"]
  node_hall_page["Audio page<br/>[page.tsx]"]
  node_hall_api["Public audio API<br/>[route.ts]"]
end

subgraph group_admin["Administration"]
  node_admin_ui["Admin workspace"]
  node_admin_data["Admin content API<br/>[route.ts]"]
  node_admin_audio["Audio management API<br/>[route.ts]"]
  node_admin_auth_route["Admin login API<br/>[route.ts]"]
  node_admin_auth["Admin authorization<br/>[admin-auth.ts]"]
end

subgraph group_platform["Shared services"]
  node_preview_routes["Collection APIs<br/>[route.ts]"]
  node_preview_service["Content preview<br/>[content-preview.ts]"]
  node_supabase["Supabase access<br/>[supabase.ts]"]
  node_database[("Content database")]
  node_cache["Content cache<br/>[cache.ts]"]
  node_redis[("Redis<br/>[redis.ts]")]
  node_rate_limit["Rate limiting<br/>[rate-limit.ts]"]
  node_jwt["JWT utilities<br/>[jwt.ts]"]
  node_logger["Structured logging<br/>[logger.ts]"]
end

node_visitor(("Site visitor"))

node_visitor -->|"browses"| node_collection_pages
node_collection_pages -->|"renders"| node_collection_ui
node_collection_pages -->|"renders"| node_casefile_ui
node_visitor -->|"opens"| node_article_pages
node_article_pages -->|"renders"| node_article_view
node_article_view -->|"renders"| node_markdown
node_preview_routes -->|"fetches previews"| node_preview_service
node_preview_service -->|"caches results"| node_cache
node_preview_service -->|"queries RPC"| node_supabase
node_supabase -->|"reads and writes"| node_database
node_visitor -->|"visits"| node_hall_page
node_hall_page -.->|"loads audio listings"| node_hall_api
node_hall_api -->|"caches results"| node_cache
node_hall_api -->|"queries audio"| node_supabase
node_team_page -->|"renders"| node_team_roster
node_team_roster -->|"renders"| node_team_core
node_admin_data -->|"checks access"| node_admin_auth
node_admin_audio -->|"checks access"| node_admin_auth
node_admin_data -->|"manages content"| node_supabase
node_admin_audio -->|"manages audio"| node_supabase
node_admin_auth_route -->|"uses tokens"| node_jwt
node_admin_auth_route -->|"limits requests"| node_rate_limit
node_admin_auth -->|"verifies tokens"| node_jwt
node_admin_auth -->|"limits requests"| node_rate_limit
node_cache -->|"uses cache backend"| node_redis
node_rate_limit -->|"uses limiter backend"| node_redis

click node_collection_pages "https://github.com/granted07/genu-website/blob/master/app/case-files/page.tsx"
click node_collection_ui "https://github.com/granted07/genu-website/blob/master/components/article-section-landing.client.tsx"
click node_casefile_ui "https://github.com/granted07/genu-website/blob/master/components/case-files-landing.client.tsx"
click node_article_pages "https://github.com/granted07/genu-website/blob/master/app/case-files/%5Bcasefiles%5D/page.tsx"
click node_article_view "https://github.com/granted07/genu-website/blob/master/components/article-page.tsx"
click node_markdown "https://github.com/granted07/genu-website/blob/master/components/article-markdown.tsx"
click node_preview_routes "https://github.com/granted07/genu-website/blob/master/app/api/casefiles/route.ts"
click node_preview_service "https://github.com/granted07/genu-website/blob/master/lib/content-preview.ts"
click node_hall_page "https://github.com/granted07/genu-website/blob/master/app/hall-of-noise/page.tsx"
click node_hall_api "https://github.com/granted07/genu-website/blob/master/app/api/hall-of-noise/route.ts"
click node_team_page "https://github.com/granted07/genu-website/blob/master/app/team/page.tsx"
click node_team_roster "https://github.com/granted07/genu-website/blob/master/components/team/team-roster.client.tsx"
click node_team_core "https://github.com/granted07/genu-website/blob/master/components/team/team-core.tsx"
click node_admin_ui "https://github.com/granted07/genu-website/blob/master/components/admin/article-editor-workspace.tsx"
click node_admin_data "https://github.com/granted07/genu-website/blob/master/app/api/admin/data/route.ts"
click node_admin_audio "https://github.com/granted07/genu-website/blob/master/app/api/admin/hall-of-noise/route.ts"
click node_admin_auth_route "https://github.com/granted07/genu-website/blob/master/app/api/admin/auth/route.ts"
click node_admin_auth "https://github.com/granted07/genu-website/blob/master/lib/admin-auth.ts"
click node_supabase "https://github.com/granted07/genu-website/blob/master/lib/supabase.ts"
click node_cache "https://github.com/granted07/genu-website/blob/master/lib/cache.ts"
click node_redis "https://github.com/granted07/genu-website/blob/master/lib/redis.ts"
click node_rate_limit "https://github.com/granted07/genu-website/blob/master/lib/rate-limit.ts"
click node_jwt "https://github.com/granted07/genu-website/blob/master/lib/jwt.ts"
click node_logger "https://github.com/granted07/genu-website/blob/master/lib/logger.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_collection_pages,node_collection_ui,node_casefile_ui,node_article_pages,node_article_view,node_markdown,node_team_page,node_team_roster,node_team_core toneBlue
class node_hall_page,node_hall_api toneAmber
class node_admin_ui,node_admin_data,node_admin_audio,node_admin_auth_route,node_admin_auth toneMint
class node_preview_routes,node_preview_service,node_supabase,node_database,node_cache,node_redis,node_rate_limit,node_jwt,node_logger toneRose
class node_visitor toneIndigo
```

## Components

### Public publishing

- [Collection pages](https://github.com/granted07/genu-website/blob/master/app/case-files/page.tsx): `app/case-files/page.tsx`
- [Collection interface](https://github.com/granted07/genu-website/blob/master/components/article-section-landing.client.tsx): `components/article-section-landing.client.tsx`
- [Case file interface](https://github.com/granted07/genu-website/blob/master/components/case-files-landing.client.tsx): `components/case-files-landing.client.tsx`
- [Article pages](https://github.com/granted07/genu-website/blob/master/app/case-files/%5Bcasefiles%5D/page.tsx): `app/case-files/[casefiles]/page.tsx`
- [Article renderer](https://github.com/granted07/genu-website/blob/master/components/article-page.tsx): `components/article-page.tsx`
- [Markdown renderer](https://github.com/granted07/genu-website/blob/master/components/article-markdown.tsx): `components/article-markdown.tsx`
- [Team page](https://github.com/granted07/genu-website/blob/master/app/team/page.tsx): `app/team/page.tsx`
- [Team roster](https://github.com/granted07/genu-website/blob/master/components/team/team-roster.client.tsx): `components/team/team-roster.client.tsx`
- [Team visual](https://github.com/granted07/genu-website/blob/master/components/team/team-core.tsx): `components/team/team-core.tsx`

### Hall of Noise

- [Audio page](https://github.com/granted07/genu-website/blob/master/app/hall-of-noise/page.tsx): `app/hall-of-noise/page.tsx`
- [Public audio API](https://github.com/granted07/genu-website/blob/master/app/api/hall-of-noise/route.ts): `app/api/hall-of-noise/route.ts`

### Administration

- [Admin workspace](https://github.com/granted07/genu-website/blob/master/components/admin/article-editor-workspace.tsx): `components/admin/article-editor-workspace.tsx`
- [Admin content API](https://github.com/granted07/genu-website/blob/master/app/api/admin/data/route.ts): `app/api/admin/data/route.ts`
- [Audio management API](https://github.com/granted07/genu-website/blob/master/app/api/admin/hall-of-noise/route.ts): `app/api/admin/hall-of-noise/route.ts`
- [Admin login API](https://github.com/granted07/genu-website/blob/master/app/api/admin/auth/route.ts): `app/api/admin/auth/route.ts`
- [Admin authorization](https://github.com/granted07/genu-website/blob/master/lib/admin-auth.ts): `lib/admin-auth.ts`

### Shared services

- [Collection APIs](https://github.com/granted07/genu-website/blob/master/app/api/casefiles/route.ts): `app/api/casefiles/route.ts`
- [Content preview](https://github.com/granted07/genu-website/blob/master/lib/content-preview.ts): `lib/content-preview.ts`
- [Supabase access](https://github.com/granted07/genu-website/blob/master/lib/supabase.ts): `lib/supabase.ts`
- **Content database**
- [Content cache](https://github.com/granted07/genu-website/blob/master/lib/cache.ts): `lib/cache.ts`
- [Redis](https://github.com/granted07/genu-website/blob/master/lib/redis.ts): `lib/redis.ts`
- [Rate limiting](https://github.com/granted07/genu-website/blob/master/lib/rate-limit.ts): `lib/rate-limit.ts`
- [JWT utilities](https://github.com/granted07/genu-website/blob/master/lib/jwt.ts): `lib/jwt.ts`
- [Structured logging](https://github.com/granted07/genu-website/blob/master/lib/logger.ts): `lib/logger.ts`

### Other components

- **Site visitor**

## Connections

- Site visitor → Collection pages: browses
- Collection pages → Collection interface: renders (evidence: `app/case-files/page.tsx`)
- Collection pages → Case file interface: renders (evidence: `app/case-files/page.tsx`)
- Site visitor → Article pages: opens
- Article pages → Article renderer: renders (evidence: `app/case-files/[casefiles]/page.tsx`)
- Article renderer → Markdown renderer: renders (evidence: `components/article-page.tsx`)
- Collection APIs → Content preview: fetches previews (evidence: `app/api/casefiles/route.ts`)
- Content preview → Content cache: caches results (evidence: `lib/content-preview.ts`)
- Content preview → Supabase access: queries RPC (evidence: `lib/content-preview.ts`)
- Supabase access → Content database: reads and writes (evidence: `lib/supabase.ts`)
- Site visitor → Audio page: visits
- Audio page → Public audio API: loads audio listings
- Public audio API → Content cache: caches results (evidence: `app/api/hall-of-noise/route.ts`)
- Public audio API → Supabase access: queries audio (evidence: `app/api/hall-of-noise/route.ts`)
- Team page → Team roster: renders (evidence: `app/team/page.tsx`)
- Team roster → Team visual: renders (evidence: `components/team/team-roster.client.tsx`)
- Admin content API → Admin authorization: checks access (evidence: `app/api/admin/data/route.ts`)
- Audio management API → Admin authorization: checks access (evidence: `app/api/admin/hall-of-noise/route.ts`)
- Admin content API → Supabase access: manages content (evidence: `app/api/admin/data/route.ts`)
- Audio management API → Supabase access: manages audio (evidence: `app/api/admin/hall-of-noise/route.ts`)
- Admin login API → JWT utilities: uses tokens (evidence: `app/api/admin/auth/route.ts`)
- Admin login API → Rate limiting: limits requests (evidence: `app/api/admin/auth/route.ts`)
- Admin authorization → JWT utilities: verifies tokens (evidence: `lib/admin-auth.ts`)
- Admin authorization → Rate limiting: limits requests (evidence: `lib/admin-auth.ts`)
- Content cache → Redis: uses cache backend (evidence: `lib/cache.ts`)
- Rate limiting → Redis: uses limiter backend (evidence: `lib/rate-limit.ts`)
