# miftahrjierd/panggung-lokal architecture

> Architecture diagram of the GitHub repository miftahrjierd/panggung-lokal, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/miftahrjierd/panggung-lokal
- Repository: https://github.com/miftahrjierd/panggung-lokal

## Overview

Panggung Lokal is an Indonesian platform connecting local bands and musicians with event organizers. Its user-facing flow is account registration or login, band profile and availability publishing, organizer band discovery and contact tracking, with dashboards and moderation supporting the marketplace. The Express app serves the public interface and mounts API routes; route handlers delegate to models or database queries. Major capabilities are represented from the README and source index, but unsampled route internals are not inferred beyond indexed references.

Main entry points: [`app.js`](https://github.com/miftahrjierd/panggung-lokal/blob/main/app.js) (Express application), [`utils/db.js`](https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/db.js) (Database access), [`routes/auth.js`](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/auth.js) (Account access), [`routes/dashboard.js`](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/dashboard.js) (Role dashboards)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Web and API"]
  node_express_app["Express application<br/>[app.js]"]
  node_public_ui["Public pages"]
end

subgraph group_market["Marketplace"]
  node_band_routes["Band profiles and search<br/>[bands.js]"]
  node_band_model["Band profile data<br/>[BandProfile.js]"]
  node_availability_routes["Availability posts<br/>[availability.js]"]
  node_availability_model["Availability data"]
  node_connection_routes["Organizer connections<br/>[connections.js]"]
  node_connection_model["Connection records<br/>[Connection.js]"]
  node_dashboard_routes["Role dashboards<br/>[dashboard.js]"]
  node_upload_routes["Media uploads<br/>[upload.js]"]
end

subgraph group_identity["Accounts and trust"]
  node_auth_routes["Account access<br/>[auth.js]"]
  node_auth_guard["Token and role checks<br/>[auth.js]"]
  node_rate_limits["Request limits<br/>[rateLimiter.js]"]
  node_passwords["Password hashing<br/>[password.js]"]
  node_validation["Input validation<br/>[validation.js]"]
  node_reports_routes["User reports<br/>[reports.js]"]
  node_admin_routes["Admin moderation<br/>[admin.js]"]
  node_report_model["Report records<br/>[Report.js]"]
  node_user_model["User records<br/>[User.js]"]
end

subgraph group_persistence["Data services"]
  node_db_access["Database access<br/>[db.js]"]
  node_memory_db[("Embedded database<br/>[memoryDb.js]")]
end

node_band_actor(("Band or musician"))
node_organizer_actor(("Event organizer"))
node_admin_actor(("Administrator"))
node_postgres[("PostgreSQL")]
node_upload_store[("Uploaded files")]

node_band_actor -->|"uses pages"| node_public_ui
node_organizer_actor -->|"uses pages"| node_public_ui
node_admin_actor -->|"uses pages"| node_public_ui
node_express_app -->|"serves static"| node_public_ui
node_band_actor -.->|"calls API"| node_express_app
node_organizer_actor -.->|"calls API"| node_express_app
node_admin_actor -.->|"calls API"| node_express_app
node_express_app -->|"mounts routes"| node_auth_routes
node_express_app -->|"mounts routes"| node_band_routes
node_express_app -->|"mounts routes"| node_availability_routes
node_express_app -->|"mounts routes"| node_connection_routes
node_express_app -->|"mounts routes"| node_upload_routes
node_express_app -->|"mounts routes"| node_dashboard_routes
node_express_app -->|"mounts routes"| node_admin_routes
node_express_app -->|"mounts routes"| node_reports_routes
node_auth_routes -->|"creates and finds"| node_user_model
node_auth_routes -->|"creates and finds"| node_band_model
node_auth_routes -->|"hashes passwords"| node_passwords
node_auth_routes -->|"validates email"| node_validation
node_auth_routes -->|"verifies sessions"| node_auth_guard
node_express_app -->|"limits API"| node_rate_limits
node_band_routes -->|"queries profiles"| node_band_model
node_availability_routes -->|"manages posts"| node_availability_model
node_connection_routes -->|"records contacts"| node_connection_model
node_dashboard_routes -->|"loads dashboard"| node_band_model
node_dashboard_routes -->|"loads dashboard"| node_availability_model
node_dashboard_routes -->|"loads dashboard"| node_connection_model
node_upload_routes -.->|"stores files"| node_upload_store
node_reports_routes -->|"creates reports"| node_report_model
node_admin_routes -->|"reviews reports"| node_report_model
node_auth_guard -->|"checks accounts"| node_db_access
node_user_model -->|"queries data"| node_db_access
node_band_model -->|"queries data"| node_db_access
node_availability_model -->|"queries data"| node_db_access
node_connection_model -->|"queries data"| node_db_access
node_report_model -->|"queries data"| node_db_access
node_db_access -->|"initializes fallback"| node_memory_db
node_db_access -->|"queries"| node_postgres

click node_express_app "https://github.com/miftahrjierd/panggung-lokal/blob/main/app.js"
click node_public_ui "https://github.com/miftahrjierd/panggung-lokal/tree/main/public"
click node_auth_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/auth.js"
click node_auth_guard "https://github.com/miftahrjierd/panggung-lokal/blob/main/middleware/auth.js"
click node_rate_limits "https://github.com/miftahrjierd/panggung-lokal/blob/main/middleware/rateLimiter.js"
click node_passwords "https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/password.js"
click node_validation "https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/validation.js"
click node_band_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/bands.js"
click node_band_model "https://github.com/miftahrjierd/panggung-lokal/blob/main/models/BandProfile.js"
click node_availability_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/availability.js"
click node_availability_model "https://github.com/miftahrjierd/panggung-lokal/blob/main/models/AvailabilityPost.js"
click node_connection_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/connections.js"
click node_connection_model "https://github.com/miftahrjierd/panggung-lokal/blob/main/models/Connection.js"
click node_dashboard_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/dashboard.js"
click node_upload_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/upload.js"
click node_reports_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/reports.js"
click node_admin_routes "https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/admin.js"
click node_report_model "https://github.com/miftahrjierd/panggung-lokal/blob/main/models/Report.js"
click node_user_model "https://github.com/miftahrjierd/panggung-lokal/blob/main/models/User.js"
click node_db_access "https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/db.js"
click node_memory_db "https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/memoryDb.js"
click node_upload_store "https://github.com/miftahrjierd/panggung-lokal/tree/main/uploads"

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_express_app,node_public_ui toneBlue
class node_band_routes,node_band_model,node_availability_routes,node_availability_model,node_connection_routes,node_connection_model,node_dashboard_routes,node_upload_routes,node_postgres,node_upload_store toneAmber
class node_auth_routes,node_auth_guard,node_rate_limits,node_passwords,node_validation,node_reports_routes,node_admin_routes,node_report_model,node_user_model toneMint
class node_db_access,node_memory_db toneRose
class node_band_actor,node_organizer_actor,node_admin_actor toneIndigo
```

## Components

### Web and API

- [Express application](https://github.com/miftahrjierd/panggung-lokal/blob/main/app.js): `app.js`
- [Public pages](https://github.com/miftahrjierd/panggung-lokal/tree/main/public): `public`

### Marketplace

- [Band profiles and search](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/bands.js): `routes/bands.js`
- [Band profile data](https://github.com/miftahrjierd/panggung-lokal/blob/main/models/BandProfile.js): `models/BandProfile.js`
- [Availability posts](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/availability.js): `routes/availability.js`
- [Availability data](https://github.com/miftahrjierd/panggung-lokal/blob/main/models/AvailabilityPost.js): `models/AvailabilityPost.js`
- [Organizer connections](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/connections.js): `routes/connections.js`
- [Connection records](https://github.com/miftahrjierd/panggung-lokal/blob/main/models/Connection.js): `models/Connection.js`
- [Role dashboards](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/dashboard.js): `routes/dashboard.js`
- [Media uploads](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/upload.js): `routes/upload.js`

### Accounts and trust

- [Account access](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/auth.js): `routes/auth.js`
- [Token and role checks](https://github.com/miftahrjierd/panggung-lokal/blob/main/middleware/auth.js): `middleware/auth.js`
- [Request limits](https://github.com/miftahrjierd/panggung-lokal/blob/main/middleware/rateLimiter.js): `middleware/rateLimiter.js`
- [Password hashing](https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/password.js): `utils/password.js`
- [Input validation](https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/validation.js): `utils/validation.js`
- [User reports](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/reports.js): `routes/reports.js`
- [Admin moderation](https://github.com/miftahrjierd/panggung-lokal/blob/main/routes/admin.js): `routes/admin.js`
- [Report records](https://github.com/miftahrjierd/panggung-lokal/blob/main/models/Report.js): `models/Report.js`
- [User records](https://github.com/miftahrjierd/panggung-lokal/blob/main/models/User.js): `models/User.js`

### Data services

- [Database access](https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/db.js): `utils/db.js`
- [Embedded database](https://github.com/miftahrjierd/panggung-lokal/blob/main/utils/memoryDb.js): `utils/memoryDb.js`

### Other components

- **Band or musician**
- **Event organizer**
- **Administrator**
- **PostgreSQL**
- [Uploaded files](https://github.com/miftahrjierd/panggung-lokal/tree/main/uploads): `uploads`

## Connections

- Band or musician → Public pages: uses pages
- Event organizer → Public pages: uses pages
- Administrator → Public pages: uses pages
- Express application → Public pages: serves static (evidence: `app.js`)
- Band or musician → Express application: calls API (evidence: `README.md`)
- Event organizer → Express application: calls API (evidence: `README.md`)
- Administrator → Express application: calls API (evidence: `README.md`)
- Express application → Account access: mounts routes (evidence: `app.js`)
- Express application → Band profiles and search: mounts routes (evidence: `app.js`)
- Express application → Availability posts: mounts routes (evidence: `app.js`)
- Express application → Organizer connections: mounts routes (evidence: `app.js`)
- Express application → Media uploads: mounts routes (evidence: `app.js`)
- Express application → Role dashboards: mounts routes (evidence: `app.js`)
- Express application → Admin moderation: mounts routes (evidence: `app.js`)
- Express application → User reports: mounts routes (evidence: `app.js`)
- Account access → User records: creates and finds (evidence: `routes/auth.js`)
- Account access → Band profile data: creates and finds (evidence: `routes/auth.js`)
- Account access → Password hashing: hashes passwords (evidence: `routes/auth.js`)
- Account access → Input validation: validates email (evidence: `routes/auth.js`)
- Account access → Token and role checks: verifies sessions (evidence: `routes/auth.js`)
- Express application → Request limits: limits API (evidence: `app.js`)
- Band profiles and search → Band profile data: queries profiles (evidence: `routes/bands.js`)
- Availability posts → Availability data: manages posts (evidence: `routes/availability.js`)
- Organizer connections → Connection records: records contacts (evidence: `routes/connections.js`)
- Role dashboards → Band profile data: loads dashboard (evidence: `routes/dashboard.js`)
- Role dashboards → Availability data: loads dashboard (evidence: `routes/dashboard.js`)
- Role dashboards → Connection records: loads dashboard (evidence: `routes/dashboard.js`)
- Media uploads → Uploaded files: stores files
- User reports → Report records: creates reports (evidence: `routes/reports.js`)
- Admin moderation → Report records: reviews reports (evidence: `routes/admin.js`)
- Token and role checks → Database access: checks accounts (evidence: `middleware/auth.js`)
- User records → Database access: queries data (evidence: `models/User.js`)
- Band profile data → Database access: queries data (evidence: `models/BandProfile.js`)
- Availability data → Database access: queries data (evidence: `models/AvailabilityPost.js`)
- Connection records → Database access: queries data (evidence: `models/Connection.js`)
- Report records → Database access: queries data (evidence: `models/Report.js`)
- Database access → Embedded database: initializes fallback (evidence: `utils/db.js`)
- Database access → PostgreSQL: queries (evidence: `utils/db.js`)
