██████╗ ███╗ ██╗ █████╗ ██╗██████╗ ██████╗██╗ ██╗███████╗ ██████╗██╗ ██╗
██╔═══██╗████╗ ██║██╔══██╗██║██╔══██╗██╔════╝██║ ██║██╔════╝██╔════╝██║ ██╔╝
██║ ██║██╔██╗ ██║███████║██║██████╔╝██║ ███████║█████╗ ██║ █████╔╝
██║ ██║██║╚██╗██║██╔══██║██║██╔══██╗██║ ██╔══██║██╔══╝ ██║ ██╔═██╗
╚██████╔╝██║ ╚████║██║ ██║██║██║ ██║╚██████╗██║ ██║███████╗╚██████╗██║ ██╗
╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝
Radio. Aufgezeichnet. Analysiert. Verstanden.
Radio ist flüchtig. Was einmal gesendet wurde, ist weg – es sei denn, jemand hat zugehört.
OnAirCheck schafft ein dauerhaftes Gedächtnis für Radiostreams. Die App nimmt Sender rund um die Uhr auf, erkennt automatisch ob gerade Musik oder Moderation läuft, und macht stundenlange Aufnahmen in Sekunden durchsuchbar. Kein manuelles Abhören mehr. Keine verpassten Momente.
Gedacht für Redakteure, die ihren eigenen Sender qualitätssichern wollen. Für Journalisten, die Mitbewerber beobachten. Für alle, die wissen wollen: Was lief wann, wie lange – und wie oft?
Aufnehmen — FFmpeg zieht jeden aktiven Stream kontinuierlich und schneidet ihn in 30-Sekunden-Segmente.
Verstehen — ICY-Metadaten aus dem Stream werden live ausgelesen. Enthält der Titel ein
" – ", ist es Musik. Kein Titel? Moderation. Zu kurz? Jingle.
Visualisieren — Eine horizontale Timeline zeigt den ganzen Tag auf einen Blick. Farbe verrät sofort: Musik (blau), Moderation (gelb), Jingle (grau).
Abhören — Klick auf ein Segment → der eingebettete Audioplayer springt direkt zur richtigen Stelle. Keine manuelle Suche in stundenlangen Aufnahmen.
┌─────────────────────────────────────────────────────────┐
│ Frontend │
│ React 18 · Vite · Tailwind CSS · lucide-react │
├─────────────────────────────────────────────────────────┤
│ Backend │
│ Node.js · Express · better-sqlite3 │
├─────────────────────────────────────────────────────────┤
│ Recording Layer │
│ FFmpeg · ICY Metadata HTTP │
├─────────────────────────────────────────────────────────┤
│ Infrastruktur │
│ Linux / Debian · PM2 · SQLite │
└─────────────────────────────────────────────────────────┘
[██████████████░░░░░░] ~70% – In aktiver Entwicklung
| Feature | Status |
|---|---|
| Projektstruktur & Monorepo | ✅ Fertig |
| Datenbankschema (SQLite) | ✅ Fertig |
| Recording-Service (FFmpeg + ICY) | ✅ Fertig |
| REST API (Streams, Segmente, Stats) | ✅ Fertig |
| Dashboard – KPI-Cards + Sender-Grid | ✅ Fertig |
| Horizon UI Redesign (Sidebar-Layout) | ✅ Fertig |
| Timeline-Ansicht mit Daypart-Farben | ✅ Fertig |
| Segment-Tabelle mit Typ-Filter | ✅ Fertig |
| Floating Tooltip auf der Timeline | ✅ Fertig |
| Audioplayer mit Range-Requests | ✅ Fertig |
| PM2-Deployment-Konfiguration | ✅ Fertig |
| Produktions-Static-Serving | ✅ Fertig |
| Segment-Suche & Filter | 🔧 Ausstehend |
| Waveform-Visualisierung (peaks.js) | 📋 Geplant |
| Whisper-Transkription | 📋 Geplant |
| KI-Zusammenfassungen | 📋 Geplant |
| Authentifizierung / Login | 📋 Geplant |
Voraussetzungen: Node.js 20+, FFmpeg installiert
# Repository klonen
git clone https://github.com/dergabriel/OnAirCheck.git
cd OnAirCheck
# Abhängigkeiten installieren
cd backend && npm install
cd ../frontend && npm install
# Backend starten (Port 3001)
cd backend && npm start
# Frontend starten (Port 3000)
cd frontend && npm run devDann im Browser: http://localhost:3000
streams
└── id · name · stream_url · logo_url · status · created_at
segments
└── id · stream_id · filename · started_at · ended_at
duration_seconds · segment_type · icy_title · artist · title
segment_type: music · talk · jingle · unknown
Dieses Projekt ist in aktiver Entwicklung.
Features, API und Datenstruktur können sich noch ändern.
Gebaut mit viel Kaffee und dem Wunsch, Radio endlich kontrollierbar zu machen.