Age, price, neighborhood, free-this-weekend, near me. List, calendar, and map share the same query instead of becoming three products.
// featured case study · original product · 2026
The right event for the right little human.
Without the Facebook scroll.
A family event finder for Las Vegas, built so parents can filter by age, price, and neighborhood instead of hunting through groups until the weekend is already over. Editorial judgment sits in front of the scrape.

- Product problem
- Kid events hide in dead feeds and Facebook groups.
- Editorial model
- Scrape fills Airtable. Only approved rows go public.
- Discovery
- List, calendar, and clustered map. Same filters everywhere.
- Delivery
- Next.js on Cloudflare Workers. Spanish surface included.
// the product problem
Vegas has the events. Parents do not have a trustworthy list.
Library storytimes, museum days, splash pads, and free weekends live across Facebook groups, casino calendars, and RSS feeds that die without a funeral. Age range, neighborhood, heat, and price actually matter. Generic event apps do not apply that bar. We wanted a narrow geography, a narrow audience, and a public calendar that stays honest when a source breaks.
// product decision
Airtable is the newsroom. The site is the printed edition.
The scrape is allowed to be messy. The public page is not. Listings land in Airtable, get geocoded and age-inferred, then wait for approval. Parents only ever see the approved slice. When a core source returns zero events, the job fails loud instead of shipping a quiet empty week.
Clustered Leaflet markers, locate, and address backfill so pins are not guessing from event names. Three hundred seventy listings still have to remain readable.
Zero-row core sources fail the run. Bad scrapes never un-approve yesterday. Nevada Moms moved off a dead RSS feed onto the MEC list API.
// the system
A city-scale board with a human gate.
The engineering is mostly data hygiene and UX clarity. Deploy is gated on purpose: Cloudflare Workers via OpenNext, preview locally, ship when the calendar is actually ready.
- 01Collect
Daily cron pulls libraries, museums, city calendars, and the MEC list API into Airtable.
- 02Enrich
Geocoding, age inference, venue addresses, and images land before a listing can go public.
- 03Approve
Editorial review keeps the kid-safe bar. Already-approved events survive a bad scrape.
- 04Publish
Next.js 15 reads the approved slice. Hourly sitemap revalidation keeps search surfaces fresh.
// the product, in frames
Screens from the shipped surface.


// what it holds
Proof, not adjectives.
The useful bits: what changed for the people using it, and what the stack actually is.
Approved listings only. Loud failures when a core source goes quiet. No silent empty weeks.
WCAG AA contrast site-wide after white-on-pastel buttons were darkened. Lighthouse accessibility back at 100.
Crawlable /es routing with hreflang. Same filters, translated shell, one editorial queue.
- Next.js 15
- React 19
- Leaflet
- Airtable
- Cloudflare Workers
- OpenNext
- Sentry
- GA4