Nestor PeñaDesign Engineer · Product Designer

Case study 03 · My own product · Redesign1 min readLive since 1 October 2026

From a Figma Make app to a festival directory that works without JavaScript.

My worldwide festival directory: audited, redesigned for phones and rebuilt as a static site.

Built with
  • Figma Make
  • Claude Design
  • Claude Code
  • Astro
  • TypeScript
  • Preact
  • MapLibre
  • GitHub Actions
  • Cloudflare Workers
128festivals
37countries
541artists
100Lighthouse score
View mode

Showing the result. Switch on the Thinking layer to see how I got there.Showing margin notes, sketches and the options I rejected.

Before / after · drag to compare

The new October month page on desktop: search, festival cards with artists, travel times and the month dockAfter · static site
The old Figma Make site on desktop, with a "Festival Collection Growing" pop-up over the pageBefore · Figma Make

Context and role

before changing a single pixel

Dancers arrive from Instagram, on a phone, onto one festival.

My own product, end to end. The first version was a Figma Make app. I listed its 42 features and how each one failed. Five problems mattered more than any visual change:

  • SecurityAny visitor could overwrite the database.
  • Data19 festivals without exact dates were hidden.
  • LinksThe main button guessed Instagram URLs that led to 404s.
  • OrderOn phones, January 2027 came before October 2026.
  • ReachWithout JavaScript, a blank page and blank link previews.

How I thought about it

one file, no database

Data

Keep the public database
A headless CMS

One validated JSON file

One maintainer, about 130 festivals. Visitors can’t change the data.

Pages

Fix the single-page app
Render on a server

Pre-rendered pages

Every festival gets a real URL with a link preview; small islands add the interaction.

Browsing

A row of month chips
One long list

Month pages, bottom dock

Thumb-reachable, and every month is an indexable page.

Links

Guess the Instagram URL
Hide the button

Only links that exist

A wrong link costs more trust than a missing one.

What I built

The festival page

Festival de Cuba Stuttgart page on desktop: dates, train and drive times from Zurich, Get passes button, calendar and Instagram buttons, line-up of 10 artists and a map of Stuttgart
The same festival page on a phone
  • One primary button. Get passes. No countdowns, no urgency copy.
  • A next step. Other festivals that month, because most visitors arrive here first.
  • Built for sharing. A generated preview image and Event data for every festival.

Month and filter sheets

Choose a month sheet: a grid of months with festival counts, empty months dashed
Filters sheet: when, where, only saved festivals, sort, and a Show 25 festivals button
The month page in dark mode

Map and travel times

Map view of October: pins and clusters across North America and Europe

Pick a city once: every card shows the fastest way there by car, train or plane, nearest first. No location prompt on load.

The admin tool

Admin festival data table: 128 festivals, quick filters for missing information, search, and Edit buttons per row

Social posts, same identity

Navy post: Just announced, 22–26 October, Festival de Cuba Stuttgart, passes from €89
Announcement
Cream post: the line-up of Festival de Cuba Stuttgart as artist chips
Line-up
Coral story: starts in 21 days, Festival de Cuba Stuttgart, add it to your calendar
Countdown story
Navy post: November, 20 festivals, with four festival cards and their date blocks
This month

Impact

quality as a build step

Live since 1 October, Lighthouse 100 on every build.

  • Accessibility. axe checks every page against WCAG 2.1 AA, light and dark.
  • Data. An invalid JSON file fails the build; a daily rebuild moves past festivals to the archive.
  • Calendars. An .ics file per festival and a feed per region.
  • Next. Artist pages, to follow a teacher across festivals.

What I'd do differently

  1. Start from one data file. The database caused the worst bugs.
  2. Validate revenue with ticket partners first.

Looking for someone who starts things?