Samstagnachmittag, fünf Spiele gleichzeitig, und ich springe zwischen Apps und Webseiten hin und her: Jede Liga hat ihre eigene Seite, jeder Dienst seine eigene Logik. Irgendwann hatte ich genug davon. Heute zeigt Handball live alle Ligen auf einer Seite, alle 15 Sekunden aktuell.
Die Idee: eine Seite statt zehn Tabs
Ich verfolge viele Ligen gleichzeitig, weil ich viele Stationen hatte: von der Bezirksklasse bis zur Regionalliga, Frauen und Männer. Die Ergebnisse gibt es alle irgendwo, aber nie zusammen. Der BHV setzt auf nuLiga mit dem Live-Ticker nuScore, und wer mehrere Ligen verfolgt, wechselt ständig zwischen den Seiten.
Der Wunsch war schlicht: eine Seite, alle Spiele, laufende ganz oben. Ohne Konto, ohne App aus dem Store, und möglichst ohne laufende Kosten. Den Ausschlag gab der letzte Spieltag der vergangenen Saison: In mehreren Ligen ging es noch um etwas, überall gleichzeitig, und ich war mehr mit Wechseln beschäftigt als mit Zuschauen.
Der erste Wurf an einem Vormittag
Am 28. September ging die erste Version online, gebaut zusammen mit Claude an einem Sonntagvormittag. Fünf nuLiga-Ligen, ein Kasten pro Liga, Endstände in Gold. Das Grundprinzip ist bis heute gleich: Meine Seite fragt nicht selbst bei den Verbänden an, sondern bei einem kleinen Programm auf meinem Webserver, einem sogenannten Worker bei Cloudflare. Der holt die Daten, bringt sie in eine einheitliche Form und gibt sie an die Seite weiter.
Der Umweg ist nötig: Die Live-Ticker der Verbände lassen sich nicht direkt aus einer fremden Webseite heraus abfragen, der Browser blockt das. Ein Server darf es. Und weil der Worker die Antworten 15 Sekunden zwischenspeichert, sieht der Verband von mir höchstens eine Anfrage pro Liga und Viertelminute, egal wie viele Leute zuschauen.
Zwei Welten unter einen Hut
Anfang Oktober kamen die DHB-Ligen dazu: 3. Liga Frauen und Männer, die Jugend-Bundesligen. Damit begann der eigentliche Spaß. handball.net liefert seine Daten ganz anders als nuScore. Der Worker übersetzt sie darum in die nuScore-Form, damit die Seite den Unterschied gar nicht merkt.
Das klingt einfacher, als es war. Keine der beiden Schnittstellen ist offiziell dokumentiert. Alles, was ich weiß, stammt aus dem Verhalten der Original-Seiten, und jede hat ihre Eigenheiten:
- Die falsche Zeitzone. handball.net schreibt die deutsche Ortszeit, kennzeichnet sie aber als Weltzeit. Ergebnis: Ein Spiel um 19:45 Uhr stand bei mir um 21:45 Uhr. Gefunden habe ich den Fehler, weil ich wusste, wann Ismaning spielt.
- Der Stand hinkt. Die Spielliste von handball.net zeigte minutenlang 9:10, während der Ticker schon bei 11:11 war. Seitdem holt der Worker für laufende Spiele jedes einzelne Ereignis, also jedes Tor, jede Zeitstrafe, und rechnet den Stand selbst.
- Die Uhr fängt neu an. In der zweiten Halbzeit beginnt die Spielzeit bei handball.net wieder bei 0:00. Mein Ticker blieb darum nach der Pause auf dem Halbzeitstand stehen, bis ich es merkte.
- Das ewige Spiel. Nach dem Abpfiff meldet handball.net das Spiel noch eine Weile als „läuft“. Bei mir stand dann „Verlängerung“. Jetzt erkennt der Worker das Signal für das Spielende selbst.
Nachtrag 07.11.2026: Diese Ligen sind vorerst wieder raus, bis es einen offiziellen Zugang gibt.
Wenn der Zwischenspeicher zu gut ist
Ein Zwischenspeicher schützt die Quellen und hält die Seite schnell. Er kann aber auch Stände festhalten, die längst nicht mehr stimmen. Genau das passierte beim ersten Spieltag mit Spielminute und Torschützen: Der Ticker zeigte Halbzeit, obwohl längst wieder gespielt wurde, und die Torschützen hinkten Minuten hinterher. Die Lösung war, jede Abfrage mit einem eigenen Zeitstempel zu versehen, so wie es das Original auch tut. Seitdem ist ein Stand höchstens 15 Sekunden alt.
Push beim Abpfiff – und ein Server ohne Wecker
Seit 11. Oktober kann man sich benachrichtigen lassen, wenn ein Spiel der HT-München-Teams vorbei ist. Dafür muss jemand regelmäßig nachsehen, ob ein Spiel gerade zu Ende gegangen ist. Mein Webserver bei Cloudflare Pages kann das nicht von sich aus, er antwortet nur, wenn jemand fragt.
Also übernahm zuerst mein Home Assistant zu Hause den Takt: jede Minute ein Anstoß. Das ging gut, bis mein Internet nach dem Glasfaser-Umstieg vier Tage lang streikte. Kein Internet zu Hause, kein Takt, keine Push-Nachricht. Seit 13. Oktober tickt der Takt darum bei Cloudflare selbst, in einem eigenen kleinen Worker. Auch das ging nicht beim ersten Versuch: Der übliche Zeitplan-Mechanismus feuerte nach dem Einrichten über 40 Minuten lang kein einziges Mal. Jetzt stellt sich der Worker nach jedem Lauf selbst einen Wecker für die nächste Minute. Home Assistant läuft als Reserve weiter.
Gemeldet wird ein Endstand übrigens erst, wenn ihn zwei Abfragen mit mindestens 40 Sekunden Abstand gleich sehen. Lieber eine halbe Minute später als eine falsche Nachricht mitten im Spiel. Und es nutzen mehr Leute, als ich erwartet hatte.
Rechenzeit ist das knappste Gut
Gestartet ist der Ticker im Gratis-Tarif von Cloudflare. Der ist großzügig bei der Zahl der Anfragen, aber knapp bei der Rechenzeit: Pro Aufruf bleiben nur wenige Millisekunden, in denen der Prozessor wirklich arbeiten darf. Warten auf die Verbände zählt nicht, Rechnen schon.
Mit jeder neuen Liga wurde das enger. Zeitweise waren es zwölf Quellen, teils als ganze Webseiten, die der Worker auseinandernehmen muss, um an Tabelle und Ergebnisse zu kommen. Irgendwann lief der Ticker nur noch teilweise: Manche Ligen kamen, andere nicht, und Cloudflare meldete, der Worker habe zu viel Rechenzeit verbraucht.
Die ehrliche Antwort: Das Projekt ist schneller gewachsen, als der Gratis-Tarif mitkam. Inzwischen zahle ich für Cloudflare und habe damit deutlich mehr Luft. Sparsam gebaut ist der Ticker trotzdem, aus zwei Gründen: Er soll auch am vollsten Spieltag zuverlässig laufen, und ich will nicht beim nächsten Wachstumsschub wieder an die Grenze stoßen. Zwei Dinge helfen dabei:
- Unter der Woche ruht der Ticker. Von Montag bis Freitagmittag läuft praktisch kein Spiel. In dieser Zeit fragt der Worker die Live-Ticker gar nicht ab, sondern liest die Ergebnisse aus den normalen Spielplänen.
- Die fertige Antwort wird gespeichert. Vorher hat der Worker nur die Rohdaten der Quellen zwischengespeichert, musste sie aber bei jedem Aufruf neu zerlegen. In der ruhigen Zeit legt er jetzt die fertige Antwort eine Stunde lang ab. Ein Aufruf kostet dann fast nichts mehr.
Und dann fiel die Quelle aus
Am 20. Oktober antwortete nuScore plötzlich für alle Ligen mit „nicht gefunden“ oder erst nach über zehn Sekunden. Selbst die Testseite des Anbieters war tot, an meinem Code lag es also nicht. Bis dahin hätte meine Seite einfach „Ticker nicht erreichbar“ gezeigt.
Jetzt versucht der Worker es bei einem Fehler genau ein zweites Mal, zeigt bis zu 15 Minuten lang den letzten guten Stand (ohne „live“-Markierung) und springt danach auf die Ergebnisse von nuLiga um. Push- Nachrichten gehen aus solchen Ersatzdaten nie raus. Lieber keine Meldung als eine falsche.
Was ich gelernt habe
- Fremde Daten sind nie so, wie man denkt. Zeitzonen, hinkende Stände, neu startende Uhren: Jede Quelle hat ihre Macken, und man findet sie nur am echten Spieltag.
- Zwischenspeichern ist ein Werkzeug mit zwei Seiten. Zu wenig belastet die Quellen und kostet Rechenzeit, zu viel friert falsche Stände ein.
- Alles, was zu Hause läuft, kann ausfallen. Was öffentlich zuverlässig sein soll, gehört in die Cloud, die Technik zu Hause bleibt die Reserve.
- Gratis reicht für den Anfang, nicht für immer. Mit vielen Ligen, Tabellen und Push war der kostenlose Tarif schnell zu klein, jetzt zahle ich für Cloudflare. KI kostet der Betrieb dagegen nichts: Claude hat beim Bauen geholfen, im laufenden Ticker steckt keine KI.
Wie es weitergeht
Und wieder ein ganz neuer Erfahrungsschatz. Wenn es so weitergeht, verstehe ich irgendwann doch noch etwas von IT.
Wer mitlesen will: Handball live läuft jedes Wochenende. Wie man es als App aufs Handy holt und den Push einrichtet, steht im Update zum Spieltag live.