01 / The problem
An events staffing business had spreadsheets for talent, spreadsheets for shifts and spreadsheets for headcount. Nobody had one shared view of who was available, who was assigned, and how many people a shift still needed.
02 / What I built
Six steps for candidates
A candidate signup flow, plus a separate onboarding flow for companies.
One board for every job
A job board with multi select filters, a status view you can drag through, and a column picker.
A map of the day
Project pages with team maps, route lines, calendars and task checklists.
Headcount that adds itself up
Planning across event, department, function, role and position, with shift demand worked out automatically.
A form builder with real range
16 question types, with nested yes or no follow ups.
A public wizard for everyone
34 steps for volunteers, 14 for professionals.
03 / Key decisions
01
Tabs load only when you open them
Using next/dynamic, the first page load stays light even though a tab takes a moment to load once you click it.
02
Shared building blocks across both apps
Filter comboboxes, the toast and the confirm modal are shared components. It took more upfront design work, but kept both apps feeling the same.
03
Colors and type live as tokens
The type scale and color palette sit in the Tailwind config, so a style change updates both apps from one place.
04
One profile fetch feeds the whole app
The profile loads once through context, instead of every screen fetching it again, which cuts repeat requests.
05
The form builder reads a schema
One field component handles each question type. Adding a new question type means writing one component, not touching every form.
04 / Outcome
Both apps are live and run the day to day work of an events staffing business.
They sign people up, build the job board, and work out how many people a shift still needs.
