Festival Guide
Built in less than 24 hours for Prague's Žižkovská Noc music festival. Takes a chaotic 200-act PDF schedule spread across 20 venues and turns it into a fast, mobile-friendly guide that flags schedule conflicts and works offline in basement venues.
Žižkovská Noc Interactive
Data Ingestion
From Unstructured PDF to Working App in 14 Hours
Extracting 230 acts, set times, and venue locations out of multi-column print PDFs and compiling them into clean TypeScript data without waiting for an official API.
Offline Reliability
Zero-Database Execution for Basement Venues
Running the full schedule, favorites, and itinerary entirely in the mobile browser using local storage. Keeps the app instant and accessible inside underground clubs with poor cell reception.
User Experience
Real-Time Schedule Conflict Warnings
Comparing band start and end times in memory to immediately flag overlapping sets as you pick them, preventing double-booked schedules before you start walking.
Why This Exists
Why festival programs and schedule PDFs fail on phones.
Navigating a multi-venue music festival with an 8-page PDF is an exercise in frustration. You are walking between venues in the dark, pinching and zooming on a static document, trying to cross-reference band times against a map.
By the time you figure out who is playing where, you have either walked 15 minutes in the wrong direction or realized two bands you wanted to see started at the exact same minute. When organizers issue last-minute schedule changes, they send out another PDF, restarting the confusion.
We built this guide in 24 hours to prove that unstructured data does not have to stay trapped in static documents. With a small ingestion script and a lightweight browser application, attendees get an interactive map, automatic conflict checks, and a personalized night schedule that works without reliable cell signal.
Real Data & In-Browser Execution
Need to turn messy, unstructured spreadsheets or PDFs into a fast internal tool or client-facing application?
Let's discuss your workflow over coffeeUnder the Hood
Six practical mechanisms that keep the schedule reliable.
The Festival Guide is not a generic template or a heavy native app. It is a lightweight client application fed by a deterministic data ingestion pipeline.
PDF Text Extraction Pipeline
Automated Python extraction (extract_pdf.py) that rips raw text from multi-column festival program releases and maps stages, timeslots, and artist names into structured data.
Alphanumeric Search Key Deduplication
Cleans band names using alphanumeric-only search keys (iggymayerov), preventing double spaces and punctuation quirks from creating duplicate listings across stages.
Zero-Database Browser Store
Manages user favorites, selected venues, and active nights purely in client-side Zustand state, ensuring instant response times and zero server tracking.
Memoized Conflict Detector
Runs time-comparison checks across favored acts using memoized React hooks (useMemo), preventing mobile frame drops and UI lag when tapping through 200+ shows.
Walk-Time Matrix & Offline Map
Integrates lightweight Leaflet mapping with pre-calculated walking times between Žižkov clubs, helping attendees judge if catching two consecutive sets is physically possible.
Itinerary Poster Compiler
Compiles favored performances into an ordered timetable graphic that attendees can screenshot or save to their phone photos for quick offline reference.
Challenging Our Own Claims
What we assumed, what we tested, and what actually happened.
Building software under a 24-hour festival deadline exposes exactly where assumptions fail. Here are four real breakdowns we encountered during ingestion and mobile testing, and how we solved them.
When a PDF page break dropped late-night shows from the schedule.
Why layout-aware parsing requires human-verified override staging.
We assumed our regular expressions would reliably parse venue schedules from top to bottom based on section headings.
When organizers released an updated PDF days before the festival, several venue timetables crossed over page breaks. The parser lost the venue header, silently dropping late-night sets at Hospoda Barrande and Husita.
We built a manual override staging dictionary into the data pipeline. When extracting data from complex print layouts under a 24-hour deadline, combining automated parsing with surgical human verification is much safer than attempting a brittle parser rewrite.
The whitespace mirage that broke band deduplication.
Why naive string equality fails on human-typed event schedules.
We assumed a standard string comparison (bandA == bandB) would easily catch duplicate artist entries across Friday and Saturday listings.
Deduplication failed on acts like "Iggy Mayerov" because one listing had an accidental double space ("Iggy Mayerov"). The naive comparison saw them as two separate bands and created duplicate cards.
We converted all artist comparisons to strict alphanumeric search keys (iggymayerov). Stripping spaces, casing, and punctuation made the deduplication immune to minor typos in the organizer's original document.
When Friday and Saturday schedules bled into each other.
Handling side-by-side timetable columns without day contamination.
We assumed we could parse timetable columns side-by-side using horizontal coordinate boundaries.
Friday and Saturday lineups were printed in adjacent columns. Minor shifts in line height caused the parser to assign Saturday bands to Friday night, creating impossible midnight schedules.
We isolated each stage into its own bounded coordinate box and added date sanity checks to ensure timestamps strictly matched the venue's active operating hours.
Why real-time overlap calculations lagged on older phones.
Keeping schedule checks instant on crowded mobile networks.
We assumed iterating through favored acts to check for time conflicts on every tap would be trivial on modern mobile devices.
On older phones running in crowded venues, recalculating time overlaps across the entire database on every favorite tap caused noticeable UI stutter.
We memoized the conflict detection logic with React hooks (useMemo) keyed strictly to changed band IDs, ensuring conflict calculations only run when your itinerary actually changes.
Working Demonstration
Explore the live festival guide on your phone or desktop.
The Žižkovská Noc guide was created as a live community project for the March 2026 festival. You can open the full interactive app to browse venues, test the conflict detector, and build a test itinerary.
Custom Tools for Analog Problems
Have an upcoming conference, event, or complex data archive trapped in PDFs or messy spreadsheets? We build clean, lightweight digital tools that solve real coordination friction without enterprise software contracts.