Die meisten Technik-Artikel zeigen das Ergebnis. Dieser hier zeigt die Werkstatt: was im vergangenen Monat entstanden ist, was ich gelernt habe und wo ich mir die Finger geklemmt habe. Der Monat in Zahlen: knapp 300 Änderungen an dieser Seite, gut ein Dutzend neue Bausteine und ein paar Pannen, aus denen ich mehr mitgenommen habe als aus allem, was auf Anhieb klappte.
So ist das gedacht: Ein Werkstattbericht pro Monat, immer mit demselben Aufbau: gebaut, gelernt, schiefgegangen, nächster Monat. Gearbeitet habe ich fast alles gemeinsam mit Claude. Wo das wichtig ist, steht es dabei.
Gebaut
Handball live: vom Ergebnisdienst zur Spieltagsseite
Aus den Tabellen ist eine Seite geworden, die am Wochenende tatsächlich offen bleibt: alle Ligen meiner Teams auf einer Seite, oben der Block „Läuft gerade“, bei laufenden Spielen mit Spielminute und letztem Torschützen. Die Ligen lassen sich per Aufklapp-Menü ein- und ausblenden, und für den Startbildschirm von iPhone und Android gibt es eine kurze Anleitung. Der Tab-Titel zeigt, wie viele Spiele gerade laufen. Das ist eine Kleinigkeit, aber ich schaue inzwischen auf den Tab statt auf die Seite.
Cloud-Routinen: KI-News und KI-Lektion
Zwei Aufgaben laufen jetzt ohne meinen Rechner. Die KI-News kommen jeden Morgen um sieben, die KI-Lektion jeden Samstag um neun. Beide sind Cloud-Routinen von Claude, die ihr Ergebnis über einen kleinen Briefkasten im Worker auf der Seite ablegen. Die Lektion erklärt KI Schritt für Schritt. Lektion 2 handelte vom maschinellen Lernen und davon, wie ein Spamfilter aus Beispielen statt aus Regeln lernt.
Ehrlich gesagt: Im September war der Inhalt der KI-News noch so lala. Zu viel Unternehmensnachrichten, zu wenig von dem, was ich im Alltag brauche, nämlich neue Funktionen und Rollouts. Inzwischen habe ich nachgeschärft: Seit Oktober sind die KI-News öffentlich, mit einer kurzen Einordnung zu jeder Meldung.
Team-Seite als App
Ich habe eine Team-Seite für eine Handballmannschaft gebastelt, mit geschütztem Zugriff: Termine mit Zu- und Absage, Liga-Stand, Dateien in einem privaten Speicher, und die Spieler pflegen ihre Stammdaten selbst. Dazu kamen die Installation als App auf dem Startbildschirm und Push-Nachrichten. Wer sich anmelden darf, entscheidet Cloudflare Access, nicht ein Passwort, das irgendwo herumfliegt. Zum Testen steckt sie voller Testdaten. Jetzt fehlt nur noch das Handballteam dazu. ;-)
Energie: rechnen statt raten
Mit Home Assistant als Datenquelle laufen jetzt monatlich zwei Auswertungen von selbst: die Energiekosten und eine „Schattenrechnung“, was derselbe Verbrauch bei einem dynamischen Tarif gekostet hätte. Zusammen mit der Simulation, ab wann sich ein Wechsel lohnt, ist das die Grundlage für eine Entscheidung, die sonst auf Bauchgefühl beruht. Die Zahlen bleiben im Cockpit, aber der Ansatz taugt für jeden, der einen Smart-Home-Zähler hat.
Das Cockpit bekommt einen Wächter
Eine Systemstatus-Seite prüft Sicherungen, Haus, Webseite und NAS und meldet sich per Push und Mail, wenn etwas rot ist: erst nach zwei Läufen in Folge, mit einer Sperre von 24 Stunden und einer Entwarnung, wenn es wieder grün wird. Die Medienübersicht zeigt, was auf der NAS liegt, samt Größe und Löschkandidaten. Und die Schriften im Cockpit kommen jetzt von der eigenen Seite statt von Google Fonts, aus Datenschutzgründen und weil es schneller ist.
Gelernt
- Ein Secret ändern heißt: neu bauen. Ich habe zweimal ein Secret in Cloudflare erneuert und mich gewundert, dass der Worker weiter mit dem alten arbeitete. Neue Secrets kommen erst mit dem nächsten Deploy an. Seitdem folgt auf jede Erneuerung ein bewusster Neubau, und die Commits heißen dann auch genau so.
- Cloudflare mag keine Skripte ohne Absender. Ein Push-Skript auf meinem Mac bekam plötzlich einen 403. Das ist der Statuscode für „Zugriff verweigert“: Der Server hat die Anfrage verstanden, will sie aber nicht ausführen. Genau so sah es zuerst auch aus, nämlich nach einem Rechteproblem. Die Ursache war aber der fehlende User-Agent, die Absenderkennung, mit der sich ein Browser oder Programm vorstellt. Cloudflare hält Anfragen ohne diese Kennung für Bots und blockt sie. Eine Zeile Code löste es, der Weg dorthin dauerte deutlich länger.
- Beim Bauen von Seiten lieber doppelt absichern als einmal hoffen. Ich habe zwei Claude-Hooks eingebaut: Der eine verhindert, dass das stillgelegte Deploy-Skript oder ein Force-Push läuft. Der andere prüft, dass neue Cockpit-Seiten auf noindex stehen und nirgends von öffentlichen Seiten verlinkt sind. Regeln in einer Doku sind gut, Regeln, die ein Skript durchsetzt, sind besser.
- Bilder wachsen im Stillen. Die Seite hatte 302 MB Fotos. Nach einem Skript, das alles auf maximal 2200 Pixel Kantenlänge verkleinert, sind es 113 MB, und niemand sieht einen Unterschied.
Das ging schief
Der Abschnitt, für den ich diesen Bericht eigentlich schreibe. Drei Pannen und eine Dauerbaustelle.
Die Live-Zahlen, die der Halbzeit hinterherliefen
Am Samstag zeigte Handball live bei einem laufenden Spiel noch Halbzeit, obwohl längst die zweite lief, und die Torschützen kamen Minuten zu spät. Die Zahlen der Datenquelle stimmten, ein Zwischenspeicher (Cache) hielt den alten Stand fest. Ich habe es erst mit einer Zeitmarke an der Abfrage versucht, das half halb, dann mit der versionierten URL der Schnittstelle, das half ganz. Zusätzlich nimmt die Seite bei einem Widerspruch zwischen Spielliste und Ereignissen jetzt die höhere Torsumme, denn ein Tor, das schon gefallen ist, verschwindet nicht wieder. Gelernt: Bei Live-Daten ist „es ist doch gecacht“ keine Entschuldigung, sondern der erste Verdacht.
Fünf Läufe für eine Zusammenfassung
Die Handball-Woche vom 4. Oktober ging nicht einmal, sondern fünfmal raus: Korrektur, Fix, Fix 2, Fix 3, Fix 4. Mal war es ein Formatfehler, dann waren die Ligen nicht in der richtigen Reihenfolge, dann kamen die Daten aus dem Cache, und „live“ war eben nicht live. Jeder Fehler für sich war klein. Zusammen ergaben sie eine Ausgabe, die ich so nie hätte verschicken wollen. Gelernt: Eine Routine, die ohne mich läuft, braucht eine Prüfung, bevor sie veröffentlicht, nicht erst danach.
„Oberliga“ war falsch, und ein zweiter Fehler steckte noch drin
Im Handball-Briefing stand bei Karte 3 „Oberliga“. Gemeint war die Bezirksoberliga. Manche Abkürzungen hat man so verinnerlicht, dass man nicht mehr darüber nachdenkt: BOL ist die Bezirksoberliga, nicht die Oberliga, und das ist eine ganz andere Spielklasse. Der zweite Fehler fiel mir erst auf, als mich jemand fragte, ob ich auch die Bezirksoberliga Alpenvorland aufnehmen kann: Meine Liga ist die Bezirksoberliga Oberbayern, und sobald es zwei davon gibt, reicht „Bezirksoberliga“ als Name nicht mehr. Inzwischen heißt die Liga überall richtig, und die Alpenvorland-Staffel steht als zehnte Liga daneben. Gelernt: Wenn ein Name fachlich stimmen muss, genügt „sieht plausibel aus“ nicht, und Abkürzungen aus dem Kopf sind die gefährlichsten.
Und die Dauerbaustelle im Keller: Sonarr und Radarr auf meiner NAS meldeten seit Anfang September zehntausende „Import failed“-Fehler. Nach einem Stromausfall habe ich sie durchgesehen: Die Datenbanken waren intakt, aber tote Einträge in der Warteschlange hatten alles zugemüllt und eine gesperrte Datenbank verursacht. Aufräumen half. Ob es jetzt dauerhaft läuft, weiß ich noch nicht. Aber ich kann es besser verfolgen: Der Systemstatus und die Medienübersicht zeigen mir, was dort passiert, statt dass ich es erst merke, wenn ein Film fehlt.
Nächsten Monat
- Handball live in der ersten vollen Saison: weniger basteln, mehr zuhören, was am Spieltag stört.
- Die KI-News weiter schärfen: Themen, Tiefe, Tonfall.
- Sonarr und Radarr nach der Beobachtungswoche auf feste Versionen setzen.
- Der erste Newsletter „Handball-Woche“ geht am 11. Oktober raus. Das wird der echte Test für den Eigenbau.
Was gut läuft, erzählt wenig. Gelernt habe ich in diesem Monat vor allem dort, wo es gehakt hat.