# finnbusse/grabbe-concept-website architecture

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

- Interactive diagram: https://gitdiagram.com/finnbusse/grabbe-concept-website
- Repository: https://github.com/finnbusse/grabbe-concept-website

## Overview

Grabbe-Gymnasium Detmold is a public school website with a Supabase-backed content-management system. Visitors browse school information, news, events and downloads; editors manage site content and settings in the CMS; users can submit contact and enrollment forms. The map includes the documented authentication and invitation flow and the internal page-content layer. Several CMS and API implementations were not sampled, so their connections are shown only where the README or excerpts support them.

Main entry points: [`components/site-layout.tsx`](https://github.com/finnbusse/grabbe-concept-website/blob/main/components/site-layout.tsx) (Site shell), [`app/cms/pages/[id]/page.tsx`](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/cms/pages/%5Bid%5D/page.tsx) (CMS workspace), [`app/page.tsx`](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/page.tsx) (School pages), [`app/aktuelles/[slug]/page.tsx`](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/aktuelles/%5Bslug%5D/page.tsx) (News articles)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public website"]
  node_public_pages["School pages<br/>[page.tsx]"]
  node_news["News articles<br/>[page.tsx]"]
  node_events["Event calendar<br/>[page.tsx]"]
  node_downloads["Document downloads<br/>[page.tsx]"]
  node_site_shell["Site shell<br/>[site-layout.tsx]"]
end

subgraph group_content["Content and CMS"]
  node_page_content["Page content<br/>[page-content.ts]"]
  node_settings["Site settings<br/>[settings.ts]"]
  node_cms["CMS workspace<br/>[page.tsx]"]
  node_block_editor["Block editor<br/>[block-editor.tsx]"]
  node_document_manager["Document manager"]
  node_content_api["Content APIs<br/>[route.ts]"]
end

subgraph group_identity["Identity and access"]
  node_login["CMS login<br/>[page.tsx]"]
  node_invitations["Invitation API<br/>[route.ts]"]
  node_auth_service{{"Supabase Auth"}}
  node_email_lib["Email sender code<br/>[email.ts]"]
end

subgraph group_submissions["Submissions"]
  node_contact_form["Contact form<br/>[contact-form.tsx]"]
  node_contact_api["Contact endpoint<br/>[route.ts]"]
  node_enrollment_form["Enrollment form<br/>[anmeldung-form.tsx]"]
  node_enrollment_api["Enrollment endpoint<br/>[route.ts]"]
end

node_visitor(("Site visitor"))
node_database[("Supabase database")]
node_email_sender{{"Email service"}}

node_visitor -->|"browses"| node_public_pages
node_visitor -->|"browses"| node_news
node_visitor -->|"browses"| node_events
node_visitor -->|"browses"| node_downloads
node_public_pages -->|"renders within"| node_site_shell
node_news -->|"renders within"| node_site_shell
node_events -->|"renders within"| node_site_shell
node_site_shell -->|"loads settings"| node_settings
node_public_pages -->|"loads sections"| node_page_content
node_events -->|"reads events"| node_database
node_news -->|"reads articles"| node_database
node_page_content -->|"reads content"| node_database
node_cms -.->|"uses editor"| node_block_editor
node_cms -.->|"manages content"| node_content_api
node_cms -->|"manages pages"| node_database
node_document_manager -.->|"manages documents"| node_database
node_visitor -->|"submits inquiry"| node_contact_form
node_contact_form -.->|"posts submission"| node_contact_api
node_contact_api -->|"stores submission"| node_database
node_visitor -->|"submits application"| node_enrollment_form
node_enrollment_form -.->|"posts application"| node_enrollment_api
node_enrollment_api -->|"stores application"| node_database
node_login -->|"authenticates"| node_auth_service
node_invitations -->|"checks session"| node_auth_service
node_invitations -->|"sends invitation"| node_email_lib
node_email_lib -.->|"delivers email"| node_email_sender

click node_public_pages "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/page.tsx"
click node_news "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/aktuelles/%5Bslug%5D/page.tsx"
click node_events "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/termine/page.tsx"
click node_downloads "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/downloads/page.tsx"
click node_site_shell "https://github.com/finnbusse/grabbe-concept-website/blob/main/components/site-layout.tsx"
click node_page_content "https://github.com/finnbusse/grabbe-concept-website/blob/main/lib/page-content.ts"
click node_settings "https://github.com/finnbusse/grabbe-concept-website/blob/main/lib/settings.ts"
click node_cms "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/cms/pages/%5Bid%5D/page.tsx"
click node_block_editor "https://github.com/finnbusse/grabbe-concept-website/blob/main/components/cms/block-editor.tsx"
click node_document_manager "https://github.com/finnbusse/grabbe-concept-website/blob/main/components/cms/documents-manager.tsx"
click node_content_api "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/page-content/route.ts"
click node_login "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/auth/login/page.tsx"
click node_invitations "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/invitations/route.ts"
click node_contact_form "https://github.com/finnbusse/grabbe-concept-website/blob/main/components/contact-form.tsx"
click node_contact_api "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/contact/route.ts"
click node_enrollment_form "https://github.com/finnbusse/grabbe-concept-website/blob/main/components/anmeldung-form.tsx"
click node_enrollment_api "https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/anmeldung/route.ts"
click node_email_lib "https://github.com/finnbusse/grabbe-concept-website/blob/main/lib/email.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_public_pages,node_news,node_events,node_downloads,node_site_shell toneBlue
class node_page_content,node_settings,node_cms,node_block_editor,node_document_manager,node_content_api,node_database toneAmber
class node_login,node_invitations,node_auth_service,node_email_lib toneMint
class node_contact_form,node_contact_api,node_enrollment_form,node_enrollment_api toneRose
class node_visitor,node_email_sender toneIndigo
```

## Components

### Public website

- [School pages](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/page.tsx): `app/page.tsx`
- [News articles](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/aktuelles/%5Bslug%5D/page.tsx): `app/aktuelles/[slug]/page.tsx`
- [Event calendar](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/termine/page.tsx): `app/termine/page.tsx`
- [Document downloads](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/downloads/page.tsx): `app/downloads/page.tsx`
- [Site shell](https://github.com/finnbusse/grabbe-concept-website/blob/main/components/site-layout.tsx): `components/site-layout.tsx`

### Content and CMS

- [Page content](https://github.com/finnbusse/grabbe-concept-website/blob/main/lib/page-content.ts): `lib/page-content.ts`
- [Site settings](https://github.com/finnbusse/grabbe-concept-website/blob/main/lib/settings.ts): `lib/settings.ts`
- [CMS workspace](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/cms/pages/%5Bid%5D/page.tsx): `app/cms/pages/[id]/page.tsx`
- [Block editor](https://github.com/finnbusse/grabbe-concept-website/blob/main/components/cms/block-editor.tsx): `components/cms/block-editor.tsx`
- [Document manager](https://github.com/finnbusse/grabbe-concept-website/blob/main/components/cms/documents-manager.tsx): `components/cms/documents-manager.tsx`
- [Content APIs](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/page-content/route.ts): `app/api/page-content/route.ts`

### Identity and access

- [CMS login](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/auth/login/page.tsx): `app/auth/login/page.tsx`
- [Invitation API](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/invitations/route.ts): `app/api/invitations/route.ts`
- **Supabase Auth**
- [Email sender code](https://github.com/finnbusse/grabbe-concept-website/blob/main/lib/email.ts): `lib/email.ts`

### Submissions

- [Contact form](https://github.com/finnbusse/grabbe-concept-website/blob/main/components/contact-form.tsx): `components/contact-form.tsx`
- [Contact endpoint](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/contact/route.ts): `app/api/contact/route.ts`
- [Enrollment form](https://github.com/finnbusse/grabbe-concept-website/blob/main/components/anmeldung-form.tsx): `components/anmeldung-form.tsx`
- [Enrollment endpoint](https://github.com/finnbusse/grabbe-concept-website/blob/main/app/api/anmeldung/route.ts): `app/api/anmeldung/route.ts`

### Other components

- **Site visitor**
- **Supabase database**
- **Email service**

## Connections

- Site visitor → School pages: browses (evidence: `README.md`)
- Site visitor → News articles: browses (evidence: `README.md`)
- Site visitor → Event calendar: browses (evidence: `README.md`)
- Site visitor → Document downloads: browses (evidence: `README.md`)
- School pages → Site shell: renders within (evidence: `app/page.tsx`)
- News articles → Site shell: renders within (evidence: `app/aktuelles/[slug]/page.tsx`)
- Event calendar → Site shell: renders within (evidence: `app/termine/page.tsx`)
- Site shell → Site settings: loads settings (evidence: `components/site-layout.tsx`)
- School pages → Page content: loads sections (evidence: `app/page.tsx`)
- Event calendar → Supabase database: reads events (evidence: `README.md`)
- News articles → Supabase database: reads articles (evidence: `app/aktuelles/[slug]/page.tsx`)
- Page content → Supabase database: reads content (evidence: `lib/page-content.ts`)
- CMS workspace → Block editor: uses editor
- CMS workspace → Content APIs: manages content
- CMS workspace → Supabase database: manages pages (evidence: `README.md`)
- Document manager → Supabase database: manages documents
- Site visitor → Contact form: submits inquiry (evidence: `README.md`)
- Contact form → Contact endpoint: posts submission
- Contact endpoint → Supabase database: stores submission (evidence: `README.md`)
- Site visitor → Enrollment form: submits application (evidence: `README.md`)
- Enrollment form → Enrollment endpoint: posts application
- Enrollment endpoint → Supabase database: stores application (evidence: `README.md`)
- CMS login → Supabase Auth: authenticates (evidence: `app/auth/login/page.tsx`)
- Invitation API → Supabase Auth: checks session (evidence: `app/api/invitations/route.ts`)
- Invitation API → Email sender code: sends invitation (evidence: `app/api/invitations/route.ts`)
- Email sender code → Email service: delivers email
