cafezuri.ch is a PAKD Labs project and, like most things in the Labs, it started with something small and slightly petty: we could never remember which café near the office was open on a Sunday. It turned into an index of every café in the city. And into a long argument with ourselves about where map data should come from.
Zürich has around 400 cafés inside the city boundary, spread across 34 neighbourhoods and 12 districts. Kreis 1 alone holds around ~100 of them, which is roughly one café for every 100 metres you can walk in the old town without getting wet. We wanted all of them on one page: Filterable by neighbourhood, honest about opening times, fast on a phone while you're standing in the rain on Limmatquai deciding where to go.
The obvious alternative and first choice for many projects is Google Places (Google Maps API). We built against it first, and then took it out again, every last field.
Part of the reason was licensing. Google's terms let you display a rating and other information but never store them yourself, which makes an honest, fast, offline-capable index awkward to build and impossible to own. Let's not talk about the fact, that you will be forever locked into the Google ecosystem. But the better reason came out of using it for a week: When we found a café with the wrong opening hours, there was nothing useful we could do. You can submit a correction into a black box and hope Google approves it.
In OpenStreetMap you just fix it. And the fix isn't just yours, it's everyone's. It lands in the map itself, and from there in every app built on it, on every phone, including all the ones we'll never hear about. That is a fundamentally different deal, and once you've seen it, paying rent on a copy of the same facts feels strange. So cafezuri.ch is now a proud member of the open mapper community, helping this open source project to gain more traction.
The thing that genuinely surprised us is how good the volunteer data is. Not perfect, but far better than we expected, and good enough in the places that matter:
| have opening hours | have a street address | have a website | have a phone number |
|---|---|---|---|
| 81% | 85% | 69% | 23% |
Look at the gap between the first number and the last. Four out of five cafés tell you exactly when you can turn up; fewer than one in four tell you how to phone ahead. Nobody decided that. It's just what hundreds of people independently thought was worth writing down. Opening hours are the thing you actually need at 08:40 on a Sunday morning.
Only 54 cafés are tagged as having wifi. 29 are tagged vegan-friendly. 188 mention a terrace. Those are not counts of how many cafés have those things, they're just counts of how many people bothered to record these facts. The map doesn't distinguish "we checked, there's no wifi" from "nobody has looked", and neither can we. So it's up to the community to fill in the missing or outdated facts.
Which is the honest pitch for this whole post: Those gaps are about ninety seconds of work each, from the pavement, on your phone. Sit down, order a flat white, open an OSM (OpenStreetMap) editor, add the wifi tag and the opening hours. It stays fixed. It shows up cafezuri.ch on the next refresh, and in a dozen other apps within the week.
Astro is our frontend framework of choice for this project, rendering the café pages on demand behind Netlify's cache. MapLibre GL for the map, because it's open source and doesn't bill per view. Supabase for the community recommendations and everything that needs to be kept in a persistent database. Keystatic as the editor, which commits straight to GitHub, so every editorial change is a normal commit with a normal diff. Café data comes from OpenStreetMap through the Overpass API, filled in where OSM is silent by the City of Zürich's licensed catering register, public, CC0, and a genuinely good dataset. It supplied 103 missing postcodes and 92 missing street names, but it's far from complete.
Two things we'd tell anyone building something similar. First: Don't key your data on OpenStreetMap element IDs. They aren't permanent, a mapper can delete and re-create a node, or promote a point to a building outline, and six of our ~400 cafés are already building outlines. Every café gets its own permanent ID that survives all of that. Second: Opening hours are a real programming language with a real parser, and roughly nobody's first guess about the syntax is right, including ours.
We spent an evening this week walking a stretch of Niederdorf with the OSM editor open, correcting a dozen entries, like a café that had quietly renamed itself, three missing phone numbers, opening hours that hadn't been checked since 2023. Our site refreshes the data during the night and had all of it by morning, without us touching anything.
That's the part worth telling other people about. Not our stack. The fact that a city's worth of small, careful, unpaid observation is sitting there in the open, maintained by people who will never meet each other, and you can build on it and give back to it on the same afternoon.
Zürich is a very good coffee city. It's an even better mapped one. Have fun exploring the great coffee places and happy mapping!
If you want to find some inspiration for a new coffee place or contribute to the open mapping community, we'd love to see you on cafezuri.ch!