Kaffee in Zürich
Rund 400 Zürcher Cafés in einem Verzeichnis, gebaut auf offenen Daten statt auf Google, aktuell gehalten von allen, die an der Karte mitarbeiten.
Ich wusste nicht mehr, welche Cafés in der Nähe des Büros am Sonntag offen haben. Kein ernsthaftes Problem — aber eines von der Sorte, die nie jemand richtig löst, weil richtig lösen heisst: vierhundert Öffnungszeiten zusammentragen und danach aktuell halten.
Die Frage nach Google
Der naheliegende Weg wäre Google Places gewesen, und ich sage gerne offen, warum es das nicht geworden ist.
Google erlaubt, eine Bewertung anzuzeigen. Nicht, sie zu behalten. Wer die Daten speichert, bewegt sich ausserhalb der Bedingungen — ein Verzeichnis lässt sich so gar nicht bauen. Es bliebe ein Fenster in eine fremde Datenbank, gemietet so lange, wie die Bedingungen zufällig gleich bleiben.
Schwerer wog der zweite Grund. Als ich ein Café mit falschen Öffnungszeiten fand, konnte ich nichts tun, ausser es zu melden und darauf zu warten, dass mir jemand recht gibt.
Offene Daten drehen beides um. Eine Korrektur ist kein Support-Ticket, sondern eine Bearbeitung. Und sie gilt für alle, die dieselbe Quelle lesen: für diese Seite, für die Karte auf irgendeinem Handy, für das, was nächstes Jahr darauf gebaut wird. Mehr Argument brauchte es nicht.
Was offene Daten einem abverlangen
OpenStreetMap liefert die Daten und die Probleme damit in derselben Bewegung.
Öffnungszeiten stehen dort nicht als Uhrzeiten. Sie sind eine kleine Syntax mit
Regeln für Feiertage, Saisons und Ausnahmen, und Mo-Fr 07:45-16:30; Sa 09:00-16:00 verlangt einen Parser, nicht ein Trennen am Semikolon.
Eingelesen sind sie immer noch unlesbar, jedenfalls vierhundert auf einmal. Deshalb trägt jede Zeile ein Band über den Tag, mit einer roten Linie auf der aktuellen Uhrzeit. Die Frage ist dann nicht mehr lies das, sondern liegt die Linie im Balken.
Die Abdeckung ist ungleichmässig, und gerade ihre Form ist aufschlussreich: 85 % der Cafés haben eine Adresse, 81 % Öffnungszeiten, 69 % eine Website und 23 % eine Telefonnummer. Das ist keine Nachlässigkeit, sondern eine ehrliche Auskunft darüber, was die Leute, die diese Karte pflegen, für wissenswert halten. Eine Telefonnummer gehört für die wenigsten dazu.
Auch die Kennungen wandern. Eine Element-ID in OpenStreetMap ist kein Versprechen — eine Umstrukturierung stromaufwärts löst still alles ab, was daran hängt. Jedes Café trägt deshalb einen eigenen, stabilen Hash, dazu ein unscharfer Abgleich für alles, was sich über Nacht verschoben hat.
Wo die Karte aufhört, füllt das Gastgewerbeverzeichnis der Stadt auf. Es steht unter CC0 und lässt sich damit schlicht verwenden.
An einem Hackathon gebaut, mit Claude Code
Entstanden ist das Ganze an einem Hackathon, geschrieben mit Claude Code.
Astro rendert die Seiten, MapLibre GL zeichnet die Karte über Swisstopo-Kacheln, Supabase hält die Empfehlungen aus der Community, Keystatic übernimmt das Redigieren, und Netlify liefert alles aus, mit Caching pro Café.
Ein geplanter Job holt jede Nacht die Daten aus OpenStreetMap, damit das Verzeichnis aktuell bleibt, auch ohne mich. Das war durchaus der Punkt. Ein Verzeichnis, das gepflegt werden muss, verfällt — dieses hier pflegen alle, die an der Karte mitarbeiten.