rabbits eat lettuce
a music festival off webflow and into a custom build, with an application system that feeds straight into the festival's own tools.
- role
- design revamp and build
- scope
- full site migration, cms and application system
- astro 6
- typescript
- tailwind v4
- sanity
- airtable
- cloudflare workers
- r2
- kv
- turnstile
01 the brief
an easter camping festival in its 18th year, running on webflow, with applications scattered across a patchwork of external form tools. move all of it into a custom build the festival could run themselves.
02 the frontend
20+ routes rebuilt in astro on a shared component system. the existing design was revamped, not thrown out — home, ticket and venue pages reworked around conversion, the rest carried across and tidied. every legacy url redirects, so eighteen years of search equity survived the move.
03 a cms with a short leash
15 sanity schemas covering only what the client actually edits: event details, faqs, lineup, galleries, ticket pricing, and switches to open and close each application category. drafts preview on the real site, with click-to-edit. a cms that models everything is a cms nobody can safely use.
04 ten application forms
volunteers, media, music, performers, vj, decor, workshops, theme camps, market stalls and festival build — multi-step, conditional, with file uploads and a review step. all ten run off one shared schema, so a category's questions, its validation and its airtable mapping live in a single place.
05 a pipeline that doesn't lose people
a cloudflare worker validates each submission, puts the files in r2 and writes the record to the right department's airtable base. turnstile, a honeypot and per-ip rate limiting keep the spam out. if airtable ever rejects a write, the submission and its files are backed up rather than lost and orphaned uploads roll back — nobody's application disappears quietly.
06 tested, then handed over
unit tests cover the form, validation, security and integration logic, running in ci with lint and typecheck. an authenticated preflight checks every airtable base for renamed fields before applications open — the one change that can quietly break live submissions. production runs on the client's own cloudflare and sanity accounts, with a plain-english guide for editing content, opening applications and reading submissions.