# ashtym/charityhustle architecture

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

- Interactive diagram: https://gitdiagram.com/ashtym/charityhustle
- Repository: https://github.com/ashtym/charityhustle

## Overview

This workspace contains several related Charity Hustle experiences, rather than one single application: a community-impact idea finder, a slide deck, and an interactive video, alongside an API server and shared database/OpenAI libraries. The idea-finder workflow is users selecting a country, completing a questionnaire, and exploring saved ideas or organisations; contact and sharing are separate capabilities. The sampled app confirms routing and context ownership, but README content and the implementation of pages, API routes, and persistence were not provided, so those connections are left out where their wiring is uncertain.

Main entry points: [`artifacts/community-impact-generator/src/App.tsx`](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/App.tsx) (Impact app), [`artifacts/api-server/src/routes/index.ts`](https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/index.ts) (API routes), [`artifacts/charity-hustle-video/src/components/video/VideoTemplate.tsx`](https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-video/src/components/video/VideoTemplate.tsx) (Video template), [`artifacts/api-server/src/routes/ideas.ts`](https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/ideas.ts) (Ideas endpoint)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_impact["Impact finder"]
  node_impact_app["Impact app<br/>[App.tsx]"]
  node_app_context["App context<br/>[AppContext.tsx]"]
  node_home["Idea questionnaire<br/>[Home.tsx]"]
  node_charities["Charity finder<br/>[Charities.tsx]"]
  node_contact["Contact page<br/>[Contact.tsx]"]
  node_sharing["Site sharing<br/>[ShareSite.tsx]"]
  node_idea_data["Idea data<br/>[data.ts]"]
  node_analytics["Event analytics<br/>[analytics.ts]"]
end

subgraph group_story["Story experiences"]
  node_slide_app["Slide deck app<br/>[App.tsx]"]
  node_slide_loader["Slide loader<br/>[slideLoader.ts]"]
  node_slide_pages["Slide pages"]
  node_video_app["Video app<br/>[App.tsx]"]
  node_video_template["Video template<br/>[VideoTemplate.tsx]"]
  node_video_scenes["Video scenes"]
  node_scene_controls["Scene controls"]
end

subgraph group_backend["Backend services"]
  node_api_app["API application<br/>[app.ts]"]
  node_api_routes["API routes<br/>[index.ts]"]
  node_idea_route["Ideas endpoint<br/>[ideas.ts]"]
  node_contact_route["Contact endpoint<br/>[contact.ts]"]
  node_health_route["Health endpoint<br/>[health.ts]"]
end

subgraph group_shared["Shared libraries"]
  node_db[("Idea database")]
  node_openai_audio["Audio integration"]
  node_openai_image["Image integration"]
  node_api_client["React API client<br/>[index.ts]"]
end

node_visitor(("Visitor"))
node_openai_service{{"OpenAI service"}}

node_visitor -->|"browses"| node_impact_app
node_impact_app -->|"provides state"| node_app_context
node_impact_app -->|"routes to"| node_home
node_impact_app -->|"routes to"| node_charities
node_impact_app -->|"routes to"| node_contact
node_impact_app -->|"offers"| node_sharing
node_impact_app -->|"reads country options"| node_idea_data
node_impact_app -->|"tracks country changes"| node_analytics
node_visitor -->|"views slides"| node_slide_app
node_slide_app -->|"loads slides"| node_slide_loader
node_slide_loader -->|"resolves slide modules"| node_slide_pages
node_visitor -->|"views video"| node_video_app
node_video_app -->|"renders video"| node_video_template
node_video_template -->|"controls playback"| node_scene_controls
node_video_template -->|"renders scenes"| node_video_scenes
node_api_app -->|"mounts routes"| node_api_routes
node_api_routes -->|"dispatches ideas"| node_idea_route
node_api_routes -->|"dispatches contact"| node_contact_route
node_api_routes -->|"dispatches health"| node_health_route
node_idea_route -.->|"uses schema"| node_db
node_idea_route -.->|"uses generation"| node_openai_image
node_openai_audio -->|"requests audio"| node_openai_service
node_openai_image -->|"requests images"| node_openai_service

click node_impact_app "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/App.tsx"
click node_app_context "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/context/AppContext.tsx"
click node_home "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/pages/Home.tsx"
click node_charities "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/pages/Charities.tsx"
click node_contact "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/pages/Contact.tsx"
click node_sharing "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/components/ShareSite.tsx"
click node_idea_data "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/lib/data.ts"
click node_analytics "https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/lib/analytics.ts"
click node_slide_app "https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-deck/src/App.tsx"
click node_slide_loader "https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-deck/src/slideLoader.ts"
click node_slide_pages "https://github.com/ashtym/charityhustle/tree/main/artifacts/charity-hustle-deck/src/pages/slides"
click node_video_app "https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-video/src/App.tsx"
click node_video_template "https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-video/src/components/video/VideoTemplate.tsx"
click node_video_scenes "https://github.com/ashtym/charityhustle/tree/main/artifacts/charity-hustle-video/src/components/video/video_scenes"
click node_scene_controls "https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-video/src/components/video/useSceneControls.ts"
click node_api_app "https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/app.ts"
click node_api_routes "https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/index.ts"
click node_idea_route "https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/ideas.ts"
click node_contact_route "https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/contact.ts"
click node_health_route "https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/health.ts"
click node_db "https://github.com/ashtym/charityhustle/tree/main/lib/db/src/schema"
click node_openai_audio "https://github.com/ashtym/charityhustle/tree/main/lib/integrations-openai-ai-server/src/audio"
click node_openai_image "https://github.com/ashtym/charityhustle/tree/main/lib/integrations-openai-ai-server/src/image"
click node_api_client "https://github.com/ashtym/charityhustle/blob/main/lib/api-client-react/src/index.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_impact_app,node_app_context,node_home,node_charities,node_contact,node_sharing,node_idea_data,node_analytics toneBlue
class node_slide_app,node_slide_loader,node_slide_pages,node_video_app,node_video_template,node_video_scenes,node_scene_controls toneAmber
class node_api_app,node_api_routes,node_idea_route,node_contact_route,node_health_route toneMint
class node_db,node_openai_audio,node_openai_image,node_api_client toneRose
class node_visitor,node_openai_service toneIndigo
```

## Components

### Impact finder

- [Impact app](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/App.tsx): `artifacts/community-impact-generator/src/App.tsx`
- [App context](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/context/AppContext.tsx): `artifacts/community-impact-generator/src/context/AppContext.tsx`
- [Idea questionnaire](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/pages/Home.tsx): `artifacts/community-impact-generator/src/pages/Home.tsx`
- [Charity finder](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/pages/Charities.tsx): `artifacts/community-impact-generator/src/pages/Charities.tsx`
- [Contact page](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/pages/Contact.tsx): `artifacts/community-impact-generator/src/pages/Contact.tsx`
- [Site sharing](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/components/ShareSite.tsx): `artifacts/community-impact-generator/src/components/ShareSite.tsx`
- [Idea data](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/lib/data.ts): `artifacts/community-impact-generator/src/lib/data.ts`
- [Event analytics](https://github.com/ashtym/charityhustle/blob/main/artifacts/community-impact-generator/src/lib/analytics.ts): `artifacts/community-impact-generator/src/lib/analytics.ts`

### Story experiences

- [Slide deck app](https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-deck/src/App.tsx): `artifacts/charity-hustle-deck/src/App.tsx`
- [Slide loader](https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-deck/src/slideLoader.ts): `artifacts/charity-hustle-deck/src/slideLoader.ts`
- [Slide pages](https://github.com/ashtym/charityhustle/tree/main/artifacts/charity-hustle-deck/src/pages/slides): `artifacts/charity-hustle-deck/src/pages/slides`
- [Video app](https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-video/src/App.tsx): `artifacts/charity-hustle-video/src/App.tsx`
- [Video template](https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-video/src/components/video/VideoTemplate.tsx): `artifacts/charity-hustle-video/src/components/video/VideoTemplate.tsx`
- [Video scenes](https://github.com/ashtym/charityhustle/tree/main/artifacts/charity-hustle-video/src/components/video/video_scenes): `artifacts/charity-hustle-video/src/components/video/video_scenes`
- [Scene controls](https://github.com/ashtym/charityhustle/blob/main/artifacts/charity-hustle-video/src/components/video/useSceneControls.ts): `artifacts/charity-hustle-video/src/components/video/useSceneControls.ts`

### Backend services

- [API application](https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/app.ts): `artifacts/api-server/src/app.ts`
- [API routes](https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/index.ts): `artifacts/api-server/src/routes/index.ts`
- [Ideas endpoint](https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/ideas.ts): `artifacts/api-server/src/routes/ideas.ts`
- [Contact endpoint](https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/contact.ts): `artifacts/api-server/src/routes/contact.ts`
- [Health endpoint](https://github.com/ashtym/charityhustle/blob/main/artifacts/api-server/src/routes/health.ts): `artifacts/api-server/src/routes/health.ts`

### Shared libraries

- [Idea database](https://github.com/ashtym/charityhustle/tree/main/lib/db/src/schema): `lib/db/src/schema`
- [Audio integration](https://github.com/ashtym/charityhustle/tree/main/lib/integrations-openai-ai-server/src/audio): `lib/integrations-openai-ai-server/src/audio`
- [Image integration](https://github.com/ashtym/charityhustle/tree/main/lib/integrations-openai-ai-server/src/image): `lib/integrations-openai-ai-server/src/image`
- [React API client](https://github.com/ashtym/charityhustle/blob/main/lib/api-client-react/src/index.ts): `lib/api-client-react/src/index.ts`

### Other components

- **Visitor**
- **OpenAI service**

## Connections

- Visitor → Impact app: browses
- Impact app → App context: provides state
- Impact app → Idea questionnaire: routes to
- Impact app → Charity finder: routes to
- Impact app → Contact page: routes to
- Impact app → Site sharing: offers
- Impact app → Idea data: reads country options
- Impact app → Event analytics: tracks country changes
- Visitor → Slide deck app: views slides
- Slide deck app → Slide loader: loads slides
- Slide loader → Slide pages: resolves slide modules
- Visitor → Video app: views video
- Video app → Video template: renders video
- Video template → Scene controls: controls playback
- Video template → Video scenes: renders scenes
- API application → API routes: mounts routes
- API routes → Ideas endpoint: dispatches ideas
- API routes → Contact endpoint: dispatches contact
- API routes → Health endpoint: dispatches health
- Ideas endpoint → Idea database: uses schema
- Ideas endpoint → Image integration: uses generation
- Audio integration → OpenAI service: requests audio
- Image integration → OpenAI service: requests images
