Rapid Prototyping & Event Navigation

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.

Live Community Build

Žižkovská Noc Interactive

March 2026
230 Acts Extracted:Ripped directly from multi-column PDF program releases.
20+ Mapped Venues:GPS coordinates and walk-time estimates across Žižkov.
Zero-Database Execution:Runs in-browser with persistent local device storage.
Live Conflict Detector:Instant visual alerts when favored set times clash.

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.

Current App Snapshot

Real Data & In-Browser Execution

230 Curated Acts: Extracted from official festival program releases and normalized with localized genres.
20+ Mapped Venues: Custom GPS pins for Žižkov clubs and performance spaces with walk-time estimates.
Live Conflict Detector: Flags time overlaps in red as you favorite bands.
My Night Itinerary: Reorders your chosen acts by time and lets you export a screenshot poster.
Private & Offline: Works on your phone without creating an account or sending GPS data to a server.

Need to turn messy, unstructured spreadsheets or PDFs into a fast internal tool or client-facing application?

Let's discuss your workflow over coffee

Under 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.

Ingestion

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.

Data Cleaning

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.

Local State

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.

Performance

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.

Navigation

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.

Export

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.

Document Parsing

When a PDF page break dropped late-night shows from the schedule.

Why layout-aware parsing requires human-verified override staging.

What we assumed

We assumed our regular expressions would reliably parse venue schedules from top to bottom based on section headings.

What actually happened

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.

What we changed

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.

String Matching

The whitespace mirage that broke band deduplication.

Why naive string equality fails on human-typed event schedules.

What we assumed

We assumed a standard string comparison (bandA == bandB) would easily catch duplicate artist entries across Friday and Saturday listings.

What actually happened

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.

What we changed

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.

Layout Structure

When Friday and Saturday schedules bled into each other.

Handling side-by-side timetable columns without day contamination.

What we assumed

We assumed we could parse timetable columns side-by-side using horizontal coordinate boundaries.

What actually happened

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.

What we changed

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.

Mobile Responsiveness

Why real-time overlap calculations lagged on older phones.

Keeping schedule checks instant on crowded mobile networks.

What we assumed

We assumed iterating through favored acts to check for time conflicts on every tap would be trivial on modern mobile devices.

What actually happened

On older phones running in crowded venues, recalculating time overlaps across the entire database on every favorite tap caused noticeable UI stutter.

What we changed

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.