Skip to content
VibeFather
Sign up free

3 cases built from this template

Same prompt, different [VARIABLES]. Click one to preview it above.

About this template

This is a three-page website for a summer music festival, built around a hero that listens to real sound. The first screen shows a wide photograph of a festival field at sunset with a slow generative sun drawn over it. Press play and an original eight-bar loop, generated by a small script in the project, starts through the Web Audio API; the sun and its ring of bars then follow live frequency data. Nothing makes a sound until the visitor asks for it, and pause and mute stay within reach.

The home page continues with a poster-style line-up where type size steps down by billing tier and the names reflow when you filter by day. Hovering a name shows an artist photo, a small live waveform and a short synthesized snippet; on a phone, a tap does the same. A dense three-day schedule follows on a flat yellow field. The map page is an illustrated inline SVG with stages, food, camping, water and first aid, legend filters and a detail panel. The tickets page compares four passes in a table with a sticky header, which becomes swipeable cards on mobile, and adds a price calculator with no checkout.

It suits promoters, venues, city weekends and community music events that want a site with more personality than a ticketing page, and developers who want a working example of frequency analysis and an interactive SVG map. The color is loud on purpose: a yellow-to-red sunset gradient and one electric green against deep violet ink, with tall condensed poster type. To adapt it, change the festival name, dates, location, genres and base price; the acts, map labels and ticket prices are rewritten to match, and the layout, colors and motion stay the same.

The template prompt

The live demo was built from exactly this text — nothing added. The other cases only change the values of the [VARIABLES].

# Music Festival Website

Build this website exactly as described below. Replace the [VARIABLES] with your own values; keep everything else.

## Brief
A three-page website (index.html, map.html, tickets.html) for [BRAND], an invented three-day summer music festival on [EVENT_DATES] at [LOCATION]. It looks like a saturated festival poster that came alive: a hot sunset gradient and one electric accent over deep violet ink, oversized condensed type, and real outdoor photography. The home hero carries a Canvas 2D visualizer that runs on a designed idle animation until the visitor presses play, then follows real frequency data from an original loop generated by a script in this project. The site also has a poster-wall line-up with day filters and hover previews, an illustrated inline SVG site map, and a tier comparison with a price calculator and no checkout. Every act, stage, vendor and place is invented.

- Audience: People deciding whether to go to the festival and which pass to buy, on a phone as often as on a laptop; they want the line-up, the schedule, how the grounds work and the price without hunting.
- Goal: Make the visitor want to be there within one screen, then get them to the right ticket tier. The ticket call to action is visible at every scroll position on every page.
- Tone: Loud, warm, specific and a little funny, like a poster written by people who run the event. Short sentences and real logistics. Never corporate.

## Stack
- Framework: Vite 5 multi-page + vanilla TypeScript
- Styling: Tailwind CSS 3.4
- Libraries: vite@5 (MIT), typescript@5 (Apache-2.0), [email protected] (MIT), postcss (MIT), autoprefixer (MIT), gsap@3 (core, ScrollTrigger, Flip) (GSAP Standard License, free including commercial use), lucide (ISC), @fontsource/anton (OFL-1.1), @fontsource-variable/instrument-sans (OFL-1.1), @fontsource/dm-mono (OFL-1.1)
- Build: `npm run build` → static files in `dist/`. No backend, no server code, no external APIs.
- Setup:
  - package.json scripts: "gen:audio": "node scripts/make-loop.mjs"; "dev": "npm run gen:audio && vite"; "build": "npm run gen:audio && tsc --noEmit && vite build".
  - vite.config.ts: base './', build.sourcemap false, build.rollupOptions.input lists index.html, map.html and tickets.html at the project root, so all three are real files in dist/.
  - tailwind.config.ts: content covers ./*.html and ./src/**/*.ts. Extend colors with ink, raised, line, flare, tangerine, sun, volt, paper, haze and lake from Design. Extend fontFamily with display (Anton), sans (Instrument Sans Variable) and mono (DM Mono).
  - src/styles.css: import @fontsource/anton/400.css, @fontsource-variable/instrument-sans, @fontsource/dm-mono/400.css and @fontsource/dm-mono/500.css, then the Tailwind layers. Define the --sunset gradient, the marquee keyframes and font-synthesis: none here. Set overflow-x: clip on html and body.
  - File layout: src/content.ts (all copy, acts, zones, tiers, image paths and links); src/shell.ts (header, marquee, footer, mobile bar, page wipe, scroll reveals); src/pages/home.ts, src/pages/map.ts, src/pages/tickets.ts; src/audio/engine.ts (AudioContext, loop, master gain, ducking); src/audio/visualizer.ts (hero canvas); src/audio/previews.ts (act snippets); scripts/make-loop.mjs. TypeScript strict mode is on.
  - scripts/make-loop.mjs uses only Node built-ins and writes public/audio/loop.wav: 44,100 Hz, 16-bit PCM, mono, 124 BPM, 8 bars of 4/4 (length = round(32 * 60 / 124 * 44100) samples, about 1.4 MB). Mix into a circular buffer so every tail wraps past the end and the loop is seamless.
  - Loop voices. Roots per bar: A2, F2, C3, G2, A2, F2, D2, E2. Kick on every beat: sine sweeping 130 to 48 Hz over 90 ms, exponential decay 240 ms, gain 0.95. Clap on beats 2 and 4: seeded white noise, band-limited as the difference of two one-pole filters, decay 120 ms, gain 0.35. Hat on off-beat eighths: high-passed seeded noise, decay 35 ms, gain 0.16. Bass in eighths on the bar root: sawtooth through a 420 Hz one-pole low-pass, gain 0.42. Pad: three sawtooths detuned by -7, 0 and +7 cents on the bar's minor or major triad through a 1,200 Hz low-pass, total gain 0.12, 300 ms attack. Pluck on a sixteenth grid: seeded mulberry32(7017), 62% chance per step, picks a note from A minor pentatonic between 220 and 880 Hz, triangle wave, exponential decay 180 ms, gain 0.22.
  - Loop mix: multiply every non-kick voice by a sidechain of 0.55 + 0.45 * (1 - exp(-secondsSinceKick / 0.12)), pass the sum through tanh(1.2x), then normalize the peak to 0.89.
  - src/audio/engine.ts: create the AudioContext only inside a user gesture. Fetch import.meta.env.BASE_URL + 'audio/loop.wav', decodeAudioData, and play with an AudioBufferSourceNode with loop = true. Graph: source -> loopGain -> analyser -> masterGain -> destination. AnalyserNode: fftSize 2048, smoothingTimeConstant 0.78. Pause stops the source and stores the offset; resume makes a new source at that offset. Mute sets masterGain only, so the visuals keep moving. If the fetch or decode fails, show the inline note 'Audio could not load. The visuals keep running.' and log nothing to the console as an error.
  - src/audio/previews.ts: each act gets a 16-step snippet from mulberry32(actIndex + 1). Notes come from minor pentatonic offsets [0,3,5,7,10,12] on a root between 110 and 220 Hz; wave type cycles sawtooth, square, triangle by act index; step length is 125 to 190 ms, chosen by the seeded generator. Each note runs through a low-pass at 1,800 Hz, Q 6, with a short gain envelope, then a preview analyser (fftSize 512) into masterGain. While a snippet plays, duck loopGain to 0.18 over 150 ms and restore it afterward. Stop with a 120 ms fade on pointer leave.
  - Reference images from code as import.meta.env.BASE_URL + 'images/<file>' and in HTML as ./images/<file>. Add public/favicon.svg: a half sun in the sunset gradient on ink. Set the title of each page to a plain <title> containing [BRAND].
  - Write ASSETS.md at the project root listing every image with path, source URL, author and license, every font and icon package with its license, and public/audio/loop.wav as 'original, generated by scripts/make-loop.mjs in this project'.

## Variables
- [BRAND] — Festival name (default: "Sunspill"). Invented, one or two words. It fills the hero headline at full width, so the headline is sized by script to fit.
- [EVENT_DATES] — Festival dates (default: "July 16–18, 2027"). Three consecutive days. The day tabs and schedule labels (Fri Jul 16, Sat Jul 17, Sun Jul 18) are derived from it.
- [LOCATION] — Site and town (default: "Cinder Meadows, Port Alder, WA"). An invented place. Map labels such as the lake name follow it.
- [LINEUP_GENRES] — Genres on the bill (default: "indie, disco and warm electronics"). Rewrite the invented act names and genre labels to fit. Never use real artists.
- [GA_PRICE] — 3-Day General pass price (default: "$189"). Sets the currency symbol and the other prices: Day Pass about 42%, Camp Weekend about 142%, Golden Hour VIP about 238%, each rounded to the nearest number ending in 9.
- [CREDIT] — keep a small "Template by VibeFather" link to https://vibefather.ai/t/music-festival-website in the footer (default: yes; delete this line to remove it)

The copy under Pages & Sections is written for the default values. If your values differ, rewrite every headline, paragraph, label and image for them — same length, tone and structure. Layout, colors, type and motion stay as described.
Keep all copy, image paths and links in one content file (for example `src/content.ts`), keyed by section, so the content can be swapped later without touching components.

Pro template. The design, sections, motion and assets parts of this prompt are for Pro members. The live demo and DESIGN.md stay free.

DESIGN.md

The design system on its own — colors, type, spacing and motion. Apply this look to a project you already have.

---
name: "Music Festival Website"
colors:
  ink: "#12072B"
  raised: "#1F0F45"
  line: "#3B2470"
  flare: "#FF2D55"
  tangerine: "#FF6A13"
  sun: "#FFC800"
  volt: "#19F5C1"
  paper: "#FFF6E5"
  haze: "#C9BEE8"
  lake: "#2438C9"
  sunset_gradient: "linear-gradient(100deg, #FFC800 0%, #FF6A13 45%, #FF2D55 100%)"
typography:
  display_hero_headline_act_names_section_headings_prices_map_labels_uppercase_line_height_0_92_letter_spacing_0_005em: { family: "Anton", weights: [400] }
  text_body_buttons_table_cells_16px_base_line_height_1_55: { family: "Instrument Sans Variable", weights: [400, 500, 600, 700] }
  mono_times_stages_dates_small_uppercase_labels_at_12_to_13px_with_0_06em_tracking: { family: "DM Mono", weights: [400, 500] }
spacing: "8px base. Gutter 32px desktop, 16px mobile. Section padding 96px desktop, 64px mobile. Content runs nearly full width up to a 1600px cap, because this is a poster and not a centered column. Dense information gets 8 to 12px row gaps."
radius: "0 on every block, photo, panel and table. 9999px only on buttons, tabs and legend chips."
---

# Music Festival Website — Design System

Apply this design system to an existing project. It describes the look and feel only; for the full site, use prompt.md.

## Colors
- **Ink** `#12072B` — Page background, deep violet ink, and text on gradient, Sun and Volt surfaces
- **Raised** `#1F0F45` — Panels, table rows, map ground
- **Line** `#3B2470` — 1px borders, map contours, inactive tracks
- **Flare** `#FF2D55` — Hot end of the sunset gradient, stage zones on the map, Friday tint
- **Tangerine** `#FF6A13` — Middle of the sunset gradient, food zones, schedule accents, Saturday tint
- **Sun** `#FFC800` — Bright end of the gradient, full-bleed schedule section, second-tier act names, camping zones
- **Volt** `#19F5C1` — The one electric accent: play button, active filters, selected states, focus rings, water zones, Sunday tint
- **Paper** `#FFF6E5` — Primary text on ink, first-aid zones
- **Haze** `#C9BEE8` — Secondary text and metadata on ink
- **Lake** `#2438C9` — The lake on the map only
- **Sunset gradient** `linear-gradient(100deg, #FFC800 0%, #FF6A13 45%, #FF2D55 100%)` — Hero headline fill, marquee band, primary ticket button, headliner names, closing band. Text on it is always Ink

## Typography
- **Display: hero headline, act names, section headings, prices, map labels. Uppercase, line-height 0.92, letter-spacing 0.005em** — Anton (OFL), weights 400. Self-host the font files.
- **Text: body, buttons, table cells. 16px base, line-height 1.55** — Instrument Sans Variable (OFL), weights 400/500/600/700. Self-host the font files.
- **Mono: times, stages, dates, small uppercase labels at 12 to 13px with 0.06em tracking** — DM Mono (OFL), weights 400/500. Self-host the font files.

## Spacing & shape
- Spacing: 8px base. Gutter 32px desktop, 16px mobile. Section padding 96px desktop, 64px mobile. Content runs nearly full width up to a 1600px cap, because this is a poster and not a centered column. Dense information gets 8 to 12px row gaps.
- Radius: 0 on every block, photo, panel and table. 9999px only on buttons, tabs and legend chips.

## Motion
- Page wipe on load: a full-viewport sunset gradient panel shrinks with scaleY from 1 to 0, transform origin top, over 0.7s with power4.inOut, then is removed. It never blocks pointer events.
- Scroll reveals with GSAP ScrollTrigger: elements with data-reveal animate from y 28 and opacity 0.2 to their final state over 0.6s with power3.out, once, staggered 0.05s. Content must never start fully invisible, so still captures stay legible.
- Marquee: CSS translateX from 0 to -50% on a duplicated track, 28s linear infinite, paused on hover.
- Line-up filter: GSAP Flip, 0.6s power3.inOut, stagger 0.012s. Leaving names fade and scale to 0.8; entering names fade in from 0.8.
- Map: paths draw in with stroke-dashoffset over 1.2s on load, zones pop with back.out(1.6), stagger 0.04s.
- Prices in the ticket summary count to the new value over 0.35s using a GSAP tween on a number.
- prefers-reduced-motion: no page wipe, no reveals, marquee static, Flip replaced by an instant swap, map appears complete, and the hero idle state renders one still frame. When the visitor presses play the bars still follow the audio, but the disc pulse and embers stay off.

## Imagery
One shoot: warm 35mm documentary film photographs at golden hour under a saturated orange and magenta sky, with light haze and fine grain. Wide scenes show no identifiable faces. Performers are backlit, with faces in shadow. Act photos are shown as duotones: CSS grayscale(1) contrast(1.15) with a day-colored layer in mix-blend-mode multiply (Friday Flare, Saturday Tangerine, Sunday Volt) and a per-act object-position cycling 20%, 50%, 80%, so three photos read as many. Icons come from Lucide. The map is drawn entirely in code.

## Tone
Loud, warm, specific and a little funny, like a poster written by people who run the event. Short sentences and real logistics. Never corporate.

---
— Prompt by VibeFather · https://vibefather.ai/t/music-festival-website · CC BY-NC 4.0 (non-commercial; commercial use needs a VibeFather Pro license) · Request removal: https://vibefather.ai/takedown

Make it yours

  • A city weekend promoter: set BRAND to the event name, EVENT_DATES to the three days and LOCATION to the downtown blocks, then rewrite the map zones for plazas and transit stops.
  • A community music festival: use LINEUP_GENRES for local folk and brass acts, lower GA_PRICE for a family day rate, and relabel the camping zone as a picnic lawn.
  • A venue running a summer series: keep the poster line-up and schedule, swap the map stages for rooms and bars, and point the ticket table at your box office.
  • A bass and club weekend: set LINEUP_GENRES to the bill, push GA_PRICE up for the Camp Weekend pass, and rename the map zones for late-night stages and water points.

Music Festival Website: questions and answers

How does the sound-reactive hero on the Music Festival Website work?

The Music Festival Website template ships an original eight-bar loop generated by a small script in the project, played through the Web Audio API. Nothing makes a sound until the visitor presses play; the sun and its ring of bars then follow live frequency data from an analyser. Pause and mute stay in reach, and if the audio cannot load the visuals keep running.

Can I change the festival name, dates and ticket prices in the Music Festival Website template?

Yes. The Music Festival Website template is driven by five variables: BRAND sets the festival name, EVENT_DATES sets the three days and their tabs, LOCATION sets the site and town, LINEUP_GENRES rewrites the act names and genre labels, and GA_PRICE sets the General pass price and scales the other tiers from it. All copy lives in one content file so you can swap it without touching the layout.

Does the Music Festival Website template sell tickets or take payments?

No. The Music Festival Website template compares four passes in a table with a sticky header that becomes swipeable cards on mobile, and adds a price calculator, but there is no checkout. The ticket call to action stays visible at every scroll position on every page, so you can point it at your own ticketing provider and keep the layout as the front door.

Can I use the Music Festival Website template for a client's event?

Commercial and client work needs Pro. The Music Festival Website template is a Pro template: the brief, stack and variables are public, the full prompt is available to Pro members, and the source code of the demos comes with Pro. Free templates' prompts and every DESIGN.md are licensed for personal, non-commercial use only.

What should I change first in the Music Festival Website template?

Start with BRAND and EVENT_DATES, because the hero headline is sized to fit the festival name and the day tabs and schedule labels derive from the dates. Then set LOCATION and LINEUP_GENRES so the map labels and invented acts match, and set GA_PRICE to your General pass so the other three tiers scale from it. The colors, poster type and motion stay as they are.

How do I build a music festival website with AI?

Copy the full prompt (Pro) from this page or run npx vibefather add music-festival-website, replace [BRAND], [GA_PRICE], [LOCATION] and [EVENT_DATES] with your own content, and paste it into Claude Code, Codex, Cursor or another AI coding agent. The live demos were built from exactly that text.

Which AI model built the Music Festival Website demo?

The Lakeside indie festival case was built by Claude Opus 5.5 in Claude Code; the Tropical bass weekend case was built by Claude Sonnet 5.5 in Claude Code; the Lakeside indie festival case was built by Gemini 4 Carbon in Cursor. Each build used the published prompt with nothing added, so you can compare the models side by side.

What tech stack and pages does the Music Festival Website template use?

Music Festival Website is a 3-page site built with Tailwind CSS, GSAP and Plain HTML, with generative / canvas, marquee and scroll animation. The prompt fixes the stack so every AI tool builds the same kind of project, and the result runs as a static site you can host anywhere.

Is the Music Festival Website template free to use?

Music Festival Website is a Pro template: the brief, stack and variables are public, and the full prompt, the source code of the live demo and a commercial license come with VibeFather Pro. Its DESIGN.md is free for personal projects.

Does the Music Festival Website template work on mobile?

Yes. Every Music Festival Website build was tested on a phone-sized screen as well as desktop before it went live, checking layout, text size and touch targets. Open the live demo on your phone, or switch the preview on this page to mobile view, to check it yourself.