# 0noxtackore/radio-ebenezer-online architecture

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

- Interactive diagram: https://gitdiagram.com/0noxtackore/radio-ebenezer-online
- Repository: https://github.com/0noxtackore/radio-ebenezer-online

## Overview

Radio Ebenezer Online is a listener-facing radio web app, with an Android shell also present. The main workflow initializes navigation and the live player, renders the service calendar and upcoming-event notifications, and lets listeners record attendance for gamification. Separate branches cover connectivity recovery and YouTube event thumbnails. The graph follows the sampled TypeScript entry point and module references; Android details are limited to the indexed MainActivity–ShareBridge relationship, and the README documents the stream and product capabilities.

Main entry points: [`src/main.ts`](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/main.ts) (App initialization), [`src/components/player.ts`](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/player.ts) (Live audio player), [`src/components/calendar.ts`](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/calendar.ts) (Service calendar), [`src/components/notifications.ts`](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/notifications.ts) (Event notifications)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_init["App initialization<br/>[main.ts]"]
  node_navigation["Navigation<br/>[navigation.ts]"]
end

subgraph group_schedule["Services and engagement"]
  node_calendar["Service calendar<br/>[calendar.ts]"]
  node_notifications["Event notifications<br/>[notifications.ts]"]
  node_date["Date utilities<br/>[date.ts]"]
  node_gamification_ui["Gamification profile<br/>[gamification.ts]"]
  node_gamification_state["Attendance and achievements<br/>[gamification.ts]"]
  node_youtube["YouTube lookup<br/>[youtube.ts]"]
end

subgraph group_stream["Listening and connectivity"]
  node_player["Live audio player<br/>[player.ts]"]
  node_volume["Volume controls<br/>[volume.ts]"]
  node_disc["Disc artwork<br/>[disc.ts]"]
  node_network["Connectivity monitoring<br/>[network.ts]"]
end

subgraph group_shared["Shared runtime"]
  node_config["App configuration<br/>[constants.ts]"]
  node_app_state["Player app state<br/>[app-state.ts]"]
  node_dom["DOM selectors<br/>[dom.ts]"]
  node_types["Domain types<br/>[index.ts]"]
end

subgraph group_android["Android shell"]
  node_main_activity["Android activity<br/>[MainActivity.java]"]
  node_share_bridge["Share bridge<br/>[ShareBridge.java]"]
end

node_listener(("Listener"))
node_radio(("Radio stream"))
node_youtube_service(("YouTube RSS and API"))

node_listener -->|"opens app"| node_init
node_init -->|"initializes"| node_navigation
node_init -->|"initializes"| node_player
node_init -->|"initializes"| node_disc
node_init -->|"renders"| node_calendar
node_init -->|"updates"| node_notifications
node_init -->|"sets up"| node_network
node_init -->|"renders"| node_gamification_ui
node_calendar -->|"loads attendance"| node_gamification_state
node_gamification_ui -->|"records attendance"| node_gamification_state
node_notifications -->|"formats countdown"| node_date
node_notifications -->|"requests thumbnails"| node_youtube
node_youtube -->|"fetches feed or API"| node_youtube_service
node_player -->|"plays stream"| node_radio
node_player -->|"reads stream settings"| node_config
node_player -->|"updates playback state"| node_app_state
node_player -->|"uses selectors"| node_dom
node_volume -->|"tracks volume"| node_app_state
node_volume -->|"uses icons"| node_config
node_calendar -->|"reads events"| node_config
node_calendar -->|"uses date labels"| node_date
node_notifications -->|"reads events"| node_config
node_dom -->|"uses selector types"| node_types
node_main_activity -->|"references bridge"| node_share_bridge

click node_init "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/main.ts"
click node_navigation "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/navigation.ts"
click node_calendar "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/calendar.ts"
click node_notifications "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/notifications.ts"
click node_date "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/utils/date.ts"
click node_gamification_ui "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/gamification.ts"
click node_gamification_state "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/state/gamification.ts"
click node_player "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/player.ts"
click node_volume "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/volume.ts"
click node_disc "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/disc.ts"
click node_network "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/network.ts"
click node_youtube "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/utils/youtube.ts"
click node_config "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/config/constants.ts"
click node_app_state "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/state/app-state.ts"
click node_dom "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/utils/dom.ts"
click node_types "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/types/index.ts"
click node_main_activity "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/android/app/src/main/java/com/ebenezer/radio/MainActivity.java"
click node_share_bridge "https://github.com/0noxtackore/radio-ebenezer-online/blob/main/android/app/src/main/java/com/ebenezer/radio/ShareBridge.java"

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_init,node_navigation toneBlue
class node_calendar,node_notifications,node_date,node_gamification_ui,node_gamification_state,node_youtube toneAmber
class node_player,node_volume,node_disc,node_network,node_youtube_service toneMint
class node_config,node_app_state,node_dom,node_types toneRose
class node_main_activity,node_share_bridge,node_listener,node_radio toneIndigo
```

## Components

### Web application

- [App initialization](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/main.ts): `src/main.ts`
- [Navigation](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/navigation.ts): `src/components/navigation.ts`

### Services and engagement

- [Service calendar](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/calendar.ts): `src/components/calendar.ts`
- [Event notifications](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/notifications.ts): `src/components/notifications.ts`
- [Date utilities](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/utils/date.ts): `src/utils/date.ts`
- [Gamification profile](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/gamification.ts): `src/components/gamification.ts`
- [Attendance and achievements](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/state/gamification.ts): `src/state/gamification.ts`
- [YouTube lookup](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/utils/youtube.ts): `src/utils/youtube.ts`

### Listening and connectivity

- [Live audio player](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/player.ts): `src/components/player.ts`
- [Volume controls](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/volume.ts): `src/components/volume.ts`
- [Disc artwork](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/disc.ts): `src/components/disc.ts`
- [Connectivity monitoring](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/components/network.ts): `src/components/network.ts`

### Shared runtime

- [App configuration](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/config/constants.ts): `src/config/constants.ts`
- [Player app state](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/state/app-state.ts): `src/state/app-state.ts`
- [DOM selectors](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/utils/dom.ts): `src/utils/dom.ts`
- [Domain types](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/src/types/index.ts): `src/types/index.ts`

### Android shell

- [Android activity](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/android/app/src/main/java/com/ebenezer/radio/MainActivity.java): `android/app/src/main/java/com/ebenezer/radio/MainActivity.java`
- [Share bridge](https://github.com/0noxtackore/radio-ebenezer-online/blob/main/android/app/src/main/java/com/ebenezer/radio/ShareBridge.java): `android/app/src/main/java/com/ebenezer/radio/ShareBridge.java`

### Other components

- **Listener**
- **Radio stream**
- **YouTube RSS and API**

## Connections

- Listener → App initialization: opens app (evidence: `README.md`)
- App initialization → Navigation: initializes (evidence: `src/main.ts`)
- App initialization → Live audio player: initializes (evidence: `src/main.ts`)
- App initialization → Disc artwork: initializes (evidence: `src/main.ts`)
- App initialization → Service calendar: renders (evidence: `src/main.ts`)
- App initialization → Event notifications: updates (evidence: `src/main.ts`)
- App initialization → Connectivity monitoring: sets up (evidence: `src/main.ts`)
- App initialization → Gamification profile: renders (evidence: `src/main.ts`)
- Service calendar → Attendance and achievements: loads attendance (evidence: `src/components/calendar.ts`)
- Gamification profile → Attendance and achievements: records attendance (evidence: `src/components/gamification.ts`)
- Event notifications → Date utilities: formats countdown (evidence: `src/components/notifications.ts`)
- Event notifications → YouTube lookup: requests thumbnails (evidence: `src/components/notifications.ts`)
- YouTube lookup → YouTube RSS and API: fetches feed or API (evidence: `src/utils/youtube.ts`)
- Live audio player → Radio stream: plays stream (evidence: `README.md`)
- Live audio player → App configuration: reads stream settings (evidence: `src/components/player.ts`)
- Live audio player → Player app state: updates playback state (evidence: `src/components/player.ts`)
- Live audio player → DOM selectors: uses selectors (evidence: `src/components/player.ts`)
- Volume controls → Player app state: tracks volume (evidence: `src/components/volume.ts`)
- Volume controls → App configuration: uses icons (evidence: `src/components/volume.ts`)
- Service calendar → App configuration: reads events (evidence: `src/components/calendar.ts`)
- Service calendar → Date utilities: uses date labels (evidence: `src/components/calendar.ts`)
- Event notifications → App configuration: reads events (evidence: `src/components/notifications.ts`)
- DOM selectors → Domain types: uses selector types (evidence: `src/utils/dom.ts`)
- Android activity → Share bridge: references bridge (evidence: `android/app/src/main/java/com/ebenezer/radio/MainActivity.java`)
