← Back
Les Santes
app Active Ajuntament de Mataró

Les Santes

Apr 18, 2026 → In Progress

Les Santes logo

Les Santes

Mataró’s biggest festival, in your pocket - built end-to-end by one person

Every summer, Mataró (Barcelona) celebrates Les Santes - six days of concerts, fire runs, giant-figure parades, and open-air events drawing tens of thousands of attendees across the whole city.

The only official tool? A printed PDF and a static website with no real-time data. People were left guessing event times, where moving parades were, and whether anything had been cancelled.

So I built the full stack myself - mobile app, marketing site, and admin CMS - solo, from scratch, in public.

Les Santes landing page
3platforms shipped
Solobuilt & maintained
MITopen source
134years of posters archived

Why this project exists

I’ve been attending Les Santes for over 20 years. Every edition, I watched the same scene repeat: people holding crumpled printed programmes, asking each other “where are the giants now?” or “what time does the correfoc start?”

The problem is genuinely hard in the moment: parades move, events start late, signal is poor in crowded streets, and the official website isn’t built for real-time use.

Mataró deserves better tooling. So I built it - a solo, public-good project with no client, no budget, and no team. Just a problem worth solving and a stack worth learning.


Engineering highlights

Live parade position - no GPS neededEach parade has a pre-planned GeoJSON route and a start time. The app interpolates their position along that route every second, client-side. No hardware, no server round-trips - just geometry and elapsed time.
Works offline - festival venues kill signalAll data is cached on first load with a timestamp. If you open the app with no connection, you still get the full schedule - with a small note showing how old the data is. No spinners, no empty screens.
Zero accounts, zero data collectedNo login, no sessions, no tokens. This simplified the whole backend and made App Store review straightforward - there was simply nothing to review in terms of data handling.
Instant cancellations via Supabase RealtimeWhen the organiser cancels an event, every connected app instance gets it immediately via Realtime broadcast. Users with notifications enabled get a push with the reason. No polling.
130 years of posters at 146 KB totalThe full poster archive (1892-present) re-encoded to AVIF. What would have been 5.2 MB of PNGs fits in 146 KB - about 97% smaller, same visual quality.
MapLibre instead of Google or Apple MapsMapLibre GL JS in a sandboxed WebView with MapTiler tiles. No third-party tracking, no native SDK setup, full control over styling. Keeps the privacy policy to one paragraph.
Live parade map with real-time position tracking

The app

The mobile app (React Native + Expo) is organised around one question: what’s happening right now?

Ara (Now)

Open the app and immediately see what’s live: a hero card with the current event and a horizontal strip of upcoming ones. No login prompt, no onboarding, no setup - just the festival.

App Ara view

Mapa (Interactive map)

Fixed events appear as pins. Moving parades show their real-time estimated position as an animated route polyline, recalculated every second by interpolating elapsed time along the pre-planned GeoJSON path. It looks live because the math runs live.

App map with live event routes

Agenda (Full programme)

The complete schedule, filterable by day, category, event type, or distance from the user’s location. A favourites system lets users pin events and get notified before they start.

Full agenda viewFavourites filter

Recursos (Archive)

A scrollable archive of every official festival poster since 1892, plus a swipeable lightbox of the Gegants postcards - each encoded in AVIF for near-instant loading.

Poster archiveGegants postcard lightboxResources tab

Key design choices

No login. No accounts. No data collected.Festival attendees want to know what’s on, not fill in forms. The app is 100% anonymous - no personal data is ever transmitted or stored. This also made App Store and Play Store approval straightforward, since there was nothing to review in terms of data handling.
Offline-first, not offline-tolerant.Festival venues have terrible signal. All event data is cached locally with a timestamp on first load, so the full app experience works without any internet connection. A non-blocking banner surfaces the cache age. No partial states, no placeholders.
Catalan as the primary language.Les Santes is a Catalan cultural festival. The app speaks Catalan first - not as localisation, but as the default. English and Spanish are fallbacks. This was the first product decision made, not the last.
AVIF everywhere.All media - app screenshots, poster archive, postcards, landing images - was re-encoded to AVIF. The 130+ year poster collection went from 5.2 MB of PNGs to ~146 KB. The same visual quality, under 30 KB per image on average.
MapLibre in a WebView instead of native map SDKs.Using Google Maps or Apple Maps would have introduced privacy policies, SDK setup overhead, and potential review friction. MapLibre GL JS runs sandboxed in a WebView with MapTiler tiles - full control over styling and data, zero third-party tracking, and a privacy policy that stays one paragraph.

The landing page

A Next.js 15 App Router site that converts visitors into app downloads and doubles as a full content management system for the festival organiser. Optimised for Core Web Vitals, fully typed, and SEO-structured to compete with the official city domain for high-intent queries.

Landing page app screens sectionPoster marquee on landing pageCustom 404 page

The admin panel

A password-protected back-office embedded in the landing site. The festival organiser can create, edit, and cancel events without touching code. Cancellations require a reason, which is broadcast instantly to all connected app instances via Supabase Realtime and delivered as a push notification via Expo Notifications.

Admin panel - event list

Event creation handles both fixed-location events and moving parades. Parade routes are drawn in geojson.io and uploaded as GeoJSON - the app then uses them for client-side live position interpolation during the festival.

Admin panel - edit event form

Tech at a glance

LayerStack
Mobile appReact Native, Expo SDK 54, Expo Router
State & cacheZustand, AsyncStorage
MapMapLibre GL JS in a WebView, MapTiler tiles
Push notificationsExpo Notifications, Supabase Realtime
Landing & CMSNext.js 15, Tailwind CSS v4, shadcn/ui
BackendSupabase (PostgreSQL, Auth, Realtime)
SEOJSON-LD @graph, FAQPage, Festival subEvent[], AI-crawler allowlist
ImagesAVIF throughout (97% size reduction)
i18nCatalan primary, English fallback

Status

The festival runs 24-29 July 2026.

The app is in active development targeting a public release on both the App Store and Google Play before the festival. Currently working towards official recognition from the Ajuntament de Mataró.

The full codebase is open source under MIT.

Links

Similar Projects

Les Santes