Public methodology
How the Bierdex works
Bierdex is a civic price index for Munich draft beer. The goal is simple: make prices visible, keep the method inspectable, and measure how beer prices move over time.
Why this exists
Beer is not just trivia in Munich. It is a small but legible cost-of-living signal, and one of the few prices people compare socially all the time. Bierdex treats that as public-interest data.
- Help people choose where to drink with fewer surprises.
- Build a public record of how prices change over time, venue by venue.
- Create transparency that could nudge venues into competing harder on price.
How data is collected
The index is built from several sources, but nothing goes onto the public map by magic. Every source has a clear place in the pipeline.
1. Venue registry from OpenStreetMap
Munich venues are seeded from OpenStreetMap and deduplicated into a city-wide registry. That gives Bierdex the map, search base, and venue universe.
2. Website menu extraction
The scraper fetches venue websites, follows menu links, reads HTML or PDFs. Text menus are parsed with regex, with an LLM as fallback. Image-based or scanned PDF menus go through OCR first. All extracted prices enter the moderation queue before publication.
3. Public submissions
People on the ground can report a price through the contribution form. Those submissions are reviewed before they appear on the map.
4. Human moderation and history
Community submissions and corrections are reviewed in the admin panel. Approved submissions are appended to the historical observation log rather than overwriting older prices.
Tech stack
The stack is intentionally boring where it should be boring: self-hosted data, a simple web app, and a map-first interface.
- Frontend
- Next.js 16 App Router, React 19, TypeScript, Tailwind CSS v4
- Map
- MapLibre GL JS with OpenFreeMap dark tiles
- Data
- Self-hosted Supabase on PostgreSQL 15, with PostgREST and Realtime
- Bot protection
- Cloudflare Turnstile on public write surfaces
- Data collection
- Overpass/OpenStreetMap venue seeding, website menu scraping, moderated public submissions
- LLM usage
- Only as fallback during menu extraction when regex is not enough; the public map remains grounded in stored observations
What the map publishes
Bierdex is designed to publish venue prices, not personal data.
- The homepage map shows the latest known approved price per venue.
- The venue modal keeps historical approved observations so price changes remain visible over time.
- Search also resolves to the latest normalized current price, not an arbitrary older row.
- User identity is not published. The public product is about venues and prices, not submitters.
Roadmap
The immediate plan is to deepen coverage and make the time-series side of the product stronger.
Now
Build coverage and trust
Expand verified venue coverage through website extraction, public reporting, moderation, and correction handling.
Next
Measure price movement over time
Use the historical observation log to track venue-level and city-level movement, with median trend views and later a deeper analytics page.
Later
Add more collection channels
Extend coverage to other German cities, add brand and country-of-origin filters, improve accessibility (colorblind-friendly palette, light mode), and tighten data quality by flagging bottled-only venues and implausible prices.
Civic action, not just beer nerd data
The point of Bierdex is not only to find a cheap Halbe. It is to make pricing legible. If that transparency helps people push venues into a more visible price fight, and some prices come down as a result, that would be a meaningful public outcome.