# arawakdesign-arch/dj-request architecture

> Architecture diagram of the GitHub repository arawakdesign-arch/dj-request, 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/arawakdesign-arch/dj-request
- Repository: https://github.com/arawakdesign-arch/dj-request
- Video tour (about a minute): https://gitdiagram.com/arawakdesign-arch/dj-request/video

## Overview

Pull Up is a nightlife and DJ platform: users discover events and music, participate in event voting/chat, and manage profiles; organizers manage events and pages, while DJs publish shareable profiles and press kits. Express serves the browser app and routes API requests to domain handlers backed by Supabase. Account deletion and inactivity retention provide a separate privacy lifecycle. The README is empty, so feature boundaries come from route names and sampled code; browser-to-API wiring and several unsampled route details are not verified.

Main entry points: [`server.js`](https://github.com/arawakdesign-arch/dj-request/blob/main/server.js) (HTTP server), [`lib/supabase.js`](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/supabase.js) (Supabase client), [`routes/dj.js`](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/dj.js) (DJ profiles), [`middleware/auth.js`](https://github.com/arawakdesign-arch/dj-request/blob/main/middleware/auth.js) (Authentication and access)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Web experience"]
  node_web["Web app<br/>[app.js]"]
  node_browser_api["Browser API client<br/>[api.js]"]
  node_server["HTTP server<br/>[server.js]"]
end

subgraph group_events["Events and participation"]
  node_events["Event management<br/>[events.js]"]
  node_live["Live activity<br/>[live.js]"]
  node_messages["Event chat<br/>[messages.js]"]
  node_screen["Event screens<br/>[screen.js]"]
  node_search["Search and lookup<br/>[search.js]"]
end

subgraph group_profiles["DJ and organizer profiles"]
  node_dj_routes["DJ profiles<br/>[dj.js]"]
  node_dj_editor["DJ profile editor"]
  node_profile_schema["DJ profile schema"]
  node_presskit["Press kit PDF<br/>[dj-presskit-pdf.js]"]
  node_orga["Organizer pages<br/>[orga.js]"]
  node_profile["Member profiles<br/>[profile.js]"]
end

subgraph group_platform["Identity and privacy"]
  node_auth_routes["Authentication routes<br/>[auth.js]"]
  node_auth_middleware["Authentication and access<br/>[auth.js]"]
  node_jwt["JWT tokens<br/>[jwt.js]"]
  node_moderation["Content moderation<br/>[moderation.js]"]
  node_account["Account deletion<br/>[account.js]"]
  node_retention["Inactive account retention<br/>[retention.js]"]
  node_db_client["Supabase client<br/>[supabase.js]"]
  node_database[("Supabase data and storage")]
end

subgraph group_integrations["External services"]
  node_soundcloud["SoundCloud search<br/>[soundcloud.js]"]
  node_deezer["Deezer API"]
  node_itunes["iTunes API"]
  node_geocoding["Address and venue APIs"]
end

node_visitors(("Visitors and members"))

node_visitors -.->|"use"| node_web
node_web -.->|"requests"| node_browser_api
node_browser_api -.->|"calls API"| node_server
node_server -->|"routes requests"| node_events
node_server -->|"routes requests"| node_live
node_server -->|"routes requests"| node_messages
node_server -->|"routes requests"| node_screen
node_server -->|"routes requests"| node_search
node_server -->|"routes requests"| node_dj_routes
node_server -->|"routes requests"| node_orga
node_server -->|"routes requests"| node_profile
node_server -->|"routes requests"| node_auth_routes
node_events -->|"queries"| node_db_client
node_live -->|"uses"| node_db_client
node_messages -->|"uses"| node_db_client
node_screen -->|"uses"| node_db_client
node_search -->|"searches DJs"| node_soundcloud
node_search -->|"searches tracks"| node_deezer
node_search -->|"searches tracks"| node_itunes
node_search -->|"looks up places"| node_geocoding
node_dj_routes -->|"queries"| node_db_client
node_dj_routes -->|"protects routes"| node_auth_middleware
node_dj_routes -->|"validates names"| node_moderation
node_dj_routes -->|"validates profiles"| node_profile_schema
node_dj_routes -->|"generates PDF"| node_presskit
node_dj_editor -.->|"uses schema"| node_profile_schema
node_orga -->|"queries"| node_db_client
node_orga -->|"protects routes"| node_auth_middleware
node_profile -->|"uses"| node_db_client
node_profile -->|"protects routes"| node_auth_middleware
node_auth_routes -->|"verifies tokens"| node_jwt
node_auth_middleware -->|"verifies tokens"| node_jwt
node_auth_middleware -->|"checks identity"| node_db_client
node_auth_middleware -->|"syncs contacts"| node_database
node_db_client -->|"connects"| node_database
node_retention -->|"deletes accounts"| node_account
node_retention -->|"tracks purge runs"| node_db_client
node_account -->|"removes user data"| node_db_client
node_server -->|"schedules purge"| node_retention

click node_web "https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/app.js"
click node_browser_api "https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/api.js"
click node_server "https://github.com/arawakdesign-arch/dj-request/blob/main/server.js"
click node_events "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/events.js"
click node_live "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/live.js"
click node_messages "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/messages.js"
click node_screen "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/screen.js"
click node_search "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/search.js"
click node_dj_routes "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/dj.js"
click node_dj_editor "https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/dj-profile-editor.js"
click node_profile_schema "https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/dj-profile-schema.js"
click node_presskit "https://github.com/arawakdesign-arch/dj-request/blob/main/lib/dj-presskit-pdf.js"
click node_orga "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/orga.js"
click node_profile "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/profile.js"
click node_auth_routes "https://github.com/arawakdesign-arch/dj-request/blob/main/routes/auth.js"
click node_auth_middleware "https://github.com/arawakdesign-arch/dj-request/blob/main/middleware/auth.js"
click node_jwt "https://github.com/arawakdesign-arch/dj-request/blob/main/lib/jwt.js"
click node_moderation "https://github.com/arawakdesign-arch/dj-request/blob/main/lib/moderation.js"
click node_account "https://github.com/arawakdesign-arch/dj-request/blob/main/lib/account.js"
click node_retention "https://github.com/arawakdesign-arch/dj-request/blob/main/lib/retention.js"
click node_db_client "https://github.com/arawakdesign-arch/dj-request/blob/main/lib/supabase.js"
click node_soundcloud "https://github.com/arawakdesign-arch/dj-request/blob/main/lib/soundcloud.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_web,node_browser_api,node_server toneBlue
class node_events,node_live,node_messages,node_screen,node_search toneAmber
class node_dj_routes,node_dj_editor,node_profile_schema,node_presskit,node_orga,node_profile toneMint
class node_auth_routes,node_auth_middleware,node_jwt,node_moderation,node_account,node_retention,node_db_client,node_database toneRose
class node_soundcloud,node_deezer,node_itunes,node_geocoding,node_visitors toneIndigo
```

## Components

### Web experience

- [Web app](https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/app.js): `public/js/app.js`
- [Browser API client](https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/api.js): `public/js/api.js`
- [HTTP server](https://github.com/arawakdesign-arch/dj-request/blob/main/server.js): `server.js`

### Events and participation

- [Event management](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/events.js): `routes/events.js`
- [Live activity](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/live.js): `routes/live.js`
- [Event chat](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/messages.js): `routes/messages.js`
- [Event screens](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/screen.js): `routes/screen.js`
- [Search and lookup](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/search.js): `routes/search.js`

### DJ and organizer profiles

- [DJ profiles](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/dj.js): `routes/dj.js`
- [DJ profile editor](https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/dj-profile-editor.js): `public/js/dj-profile-editor.js`
- [DJ profile schema](https://github.com/arawakdesign-arch/dj-request/blob/main/public/js/dj-profile-schema.js): `public/js/dj-profile-schema.js`
- [Press kit PDF](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/dj-presskit-pdf.js): `lib/dj-presskit-pdf.js`
- [Organizer pages](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/orga.js): `routes/orga.js`
- [Member profiles](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/profile.js): `routes/profile.js`

### Identity and privacy

- [Authentication routes](https://github.com/arawakdesign-arch/dj-request/blob/main/routes/auth.js): `routes/auth.js`
- [Authentication and access](https://github.com/arawakdesign-arch/dj-request/blob/main/middleware/auth.js): `middleware/auth.js`
- [JWT tokens](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/jwt.js): `lib/jwt.js`
- [Content moderation](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/moderation.js): `lib/moderation.js`
- [Account deletion](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/account.js): `lib/account.js`
- [Inactive account retention](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/retention.js): `lib/retention.js`
- [Supabase client](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/supabase.js): `lib/supabase.js`
- **Supabase data and storage**

### External services

- [SoundCloud search](https://github.com/arawakdesign-arch/dj-request/blob/main/lib/soundcloud.js): `lib/soundcloud.js`
- **Deezer API**
- **iTunes API**
- **Address and venue APIs**

### Other components

- **Visitors and members**

## Connections

- Visitors and members → Web app: use
- Web app → Browser API client: requests
- Browser API client → HTTP server: calls API
- HTTP server → Event management: routes requests (evidence: `server.js`)
- HTTP server → Live activity: routes requests (evidence: `server.js`)
- HTTP server → Event chat: routes requests (evidence: `server.js`)
- HTTP server → Event screens: routes requests (evidence: `server.js`)
- HTTP server → Search and lookup: routes requests (evidence: `server.js`)
- HTTP server → DJ profiles: routes requests (evidence: `server.js`)
- HTTP server → Organizer pages: routes requests (evidence: `server.js`)
- HTTP server → Member profiles: routes requests (evidence: `server.js`)
- HTTP server → Authentication routes: routes requests (evidence: `server.js`)
- Event management → Supabase client: queries (evidence: `routes/events.js`)
- Live activity → Supabase client: uses (evidence: `routes/live.js`)
- Event chat → Supabase client: uses (evidence: `routes/messages.js`)
- Event screens → Supabase client: uses (evidence: `routes/screen.js`)
- Search and lookup → SoundCloud search: searches DJs (evidence: `routes/search.js`)
- Search and lookup → Deezer API: searches tracks (evidence: `routes/search.js`)
- Search and lookup → iTunes API: searches tracks (evidence: `routes/search.js`)
- Search and lookup → Address and venue APIs: looks up places (evidence: `routes/search.js`)
- DJ profiles → Supabase client: queries (evidence: `routes/dj.js`)
- DJ profiles → Authentication and access: protects routes (evidence: `routes/dj.js`)
- DJ profiles → Content moderation: validates names (evidence: `routes/dj.js`)
- DJ profiles → DJ profile schema: validates profiles (evidence: `routes/dj.js`)
- DJ profiles → Press kit PDF: generates PDF (evidence: `routes/dj.js`)
- DJ profile editor → DJ profile schema: uses schema
- Organizer pages → Supabase client: queries (evidence: `routes/orga.js`)
- Organizer pages → Authentication and access: protects routes (evidence: `routes/orga.js`)
- Member profiles → Supabase client: uses (evidence: `routes/profile.js`)
- Member profiles → Authentication and access: protects routes (evidence: `routes/profile.js`)
- Authentication routes → JWT tokens: verifies tokens (evidence: `routes/auth.js`)
- Authentication and access → JWT tokens: verifies tokens (evidence: `middleware/auth.js`)
- Authentication and access → Supabase client: checks identity (evidence: `middleware/auth.js`)
- Authentication and access → Supabase data and storage: syncs contacts (evidence: `middleware/auth.js`)
- Supabase client → Supabase data and storage: connects (evidence: `lib/supabase.js`)
- Inactive account retention → Account deletion: deletes accounts (evidence: `lib/retention.js`)
- Inactive account retention → Supabase client: tracks purge runs (evidence: `lib/retention.js`)
- Account deletion → Supabase client: removes user data (evidence: `lib/account.js`)
- HTTP server → Inactive account retention: schedules purge (evidence: `server.js`)
