Locale โ€” Case Study
Local Events Discovery App

discover
locale.

A mobile-first app that finds free community events, pop-ups, and live shows in Sacramento โ€” pulling from Ticketmaster, Reddit, Meetup, and more in real time.

Product Designer Next.js 14 ยท TypeScript Live APIs MVP In Development
2
Live API Sources
5
Screens Built
V4
Roadmap Scoped
0
Blank States Allowed
01 โ€” What it does

Built for spontaneous discovery

Three modes for three moments โ€” browsing what's on, exploring where things are, and tracking what you're doing.

Discover

Tonight strip surfaces same-day events. Trending pills show what's buzzing. Category and date filters cut through the noise.

Tonight StripTrendingDate FiltersCategory Pills
Map

Color-coded teardrop pins by category. Bottom sheet lists nearby events. Links to Apple Maps or Google Maps based on device.

Category PinsBottom SheetPlatform Maps
Plans

14-day calendar strip with event dots. Going tab tracks RSVPs. Saved tab holds your watchlist. Tap any day to filter.

14-Day StripGoing / SavedRSVP System
02 โ€” Screens

Three views, one experience

Each screen is tuned for a distinct moment in the discovery journey. Click any phone to pause.

DiscoverTonight ยท Trending ยท Feed
MapPins ยท Filter ยท Sheet
PlansCalendar ยท Going ยท Saved
03 — Design Direction

Crafted with intention

Every visual and interaction decision was grounded in a specific intent — from the color of a dot to the shape of a map pin. Here is what drove the key choices.

Dark Canvas

The dark-first design ensures event imagery, emoji, and category colors pop. A light interface flattens everything; this one recedes so content leads. Built mobile-first at 390×844px — the real use case is a phone in hand, not a browser tab.

Background #080810 · Surface #10101C
The Green

The accent color evolved from #7CFF6B (electric, harsh) to #5DD44A (organic, warm). That single shift changed the feel from “tech product” to “neighborhood guide.” The dot moved from red to green for the same reason — alive, not alarming.

#7CFF6B → #5DD44A · electric → organic
Category Color System

Eight distinct hues, one per event type, used consistently across cards, map pins, and filter pills. Users learn the system in one session — a purple pin means music before they read a word. Color does the work language slows down.

8 categories · consistent across all surfaces
Music
Food & Drink
Art
Sports
Comedy
Film
Markets
Community
All
Signature decisions
📹
Tonight Strip — Story Format

Cards borrowed from the social story format — a familiar scroll behavior redirected toward real-world events. Widened to 150×190px after testing narrower cards felt cramped and easy to skip.

📍
Teardrop Map Pins

border-radius: 50% 50% 50% 4px — a directional shape that points to a place with personality. Distinct from generic circles; the slight asymmetry communicates “go here.”

🏷
Source Badges

Every event card shows where the event came from — Reddit, Meetup, Local News, Community. Provenance transparency builds trust, especially for free events from unofficial sources.

Going / Saved Duality

Two distinct states of intent: Going (committed RSVP, added to your calendar strip) and Saved (soft wishlist, no pressure). Marking Going triggers a confetti micro-animation — celebrating the moment of decision.

🗺
Platform-Native Map Links

Event venues link to Apple Maps on iOS and Google Maps on Android/desktop. A small decision that reflects genuine respect for the user’s ecosystem — no forcing a third platform into an already-long journey.

🪭
Zero Blank States

Hardcoded fallback events ensure no screen is ever empty, even when both APIs fail. Resilience is a design decision, not an afterthought. The app should always feel alive — because the city always is.

Tried & reverted
Removed
Wordmark in header

App identity comes from the product, not logo repetition. Removed in favor of clean utility space.

Removed
Shimmer loading bar

Felt deceptive about actual load time. Replaced with an honest spinner that communicates real network activity.

Removed
Borderless search button

Minimalism at the cost of affordance. Users need a clear tap target — the border was restored.

Removed
Capacity indicator bar

Added anxiety to the discovery flow before users even decided they were interested. Cut entirely.

04 — End User & Research

Designed for the Friday-evening scroll

Research was conducted entirely online — listening to where Sacramento residents actually talk about events, and auditing what existing platforms get wrong. The insight that drove every decision: people want to scroll and connect.

Alex Chen
27 · Sacramento, CA · Works remote
The moment

“It’s 6pm Friday. I want to do something tonight — not just scroll. But I don’t know where to start looking. Google gives me tourist results. Eventbrite shows nothing free. I end up staying home.”

Alex lives in Midtown, knows the city has a thriving arts and food scene, but has no reliable way to surface it. The events exist. The discovery layer doesn’t.
Midtown resident Free events Spontaneous plans Community-minded Anti-tourist results
Method 01 · Community Listening
Reddit r/Sacramento & Local Groups

Every Friday and Saturday, r/Sacramento sees the same post: “What’s happening this weekend?” The replies consistently surface events that aren’t on any platform — pop-up markets, free concerts, gallery openings, block parties. The community does the curation work by hand because no tool does it for them.

“The discovery experience shouldn’t require a Reddit thread.”
Method 02 · Competitive Audit
Eventbrite, Meetup, Facebook Events

Eventbrite optimizes for ticketed commercial events — concerts, conferences, galas. Meetup serves recurring interest groups. Facebook Events are buried under an opaque algorithm. None of them surface the category Locale is built for: free, community-driven, spontaneous local happenings. The gap is structural, not accidental.

Free festivals, gallery nights, pop-up markets — no existing platform owns this.
Method 03 · Behavioral Mapping
The “Scroll & Connect” Pattern

Users open social apps in the evening to decompress — but that scroll habit sits right next to a latent desire for real-world connection. The behavior is the same; the destination is different. Locale is designed to intercept that exact moment: same familiar scroll, same story-card format, but the payoff is something to actually go do.

Same UX pattern as social media. Outcome is a night out, not more screentime.
The core insight

“The most underserved use case in local discovery isn’t finding the next concert — it’s finding something worth leaving the couch for, tonight, that doesn’t cost anything.”

Sacramento has hundreds of free community events every week. They live on Reddit threads, city calendar pages, and Facebook groups. Locale pulls them into one scrollable surface — and makes the discovery feel as effortless as checking Instagram.

05 โ€” Process

From vision to working product

The development process was deliberately iterative โ€” each phase producing something tangible to evaluate, critique, and build on.

"Every design decision was validated before moving forward. If something felt off, it was revisited โ€” not rationalized away."

Phase 01

Desktop Prototype โ€” Establishing the Core Experience

Built the first interactive prototype as a desktop layout to establish the foundational information architecture: a map/list dual-view, category filter pills, and event cards. This phase validated the core content model โ€” what an "event" is, how it's displayed, and how users navigate between browse modes.

Map / List ToggleCategory FiltersEvent CardsInformation Architecture
Phase 02

Mobile Prototype โ€” Designing for the Real Use Case

Rebuilt entirely for mobile (390ร—844px) โ€” because the real use case is someone on their couch on a Friday evening, not at a desktop. This phase introduced the Tonight strip, Trending pills, date filters with a calendar picker, the Plans tab with a 14-day calendar strip, and a map view with color-coded teardrop pins and a sliding bottom sheet.

Multiple design decisions were tested and deliberately reverted โ€” a wordmark, a shimmer loading bar, a borderless search input, and a capacity bar โ€” demonstrating disciplined editing over feature accumulation.

Tonight StripPlans + CalendarTrending SectionMap + Bottom SheetPost Form
Phase 03

Live API Integration โ€” Wiring Real Data

Connected to Ticketmaster Discovery API and Anthropic's web search tool, with a multi-source merge architecture, deduplication, server-side caching, and hardcoded fallback events to prevent blank states. A key finding: Anthropic's tool-use pattern requires a proper two-turn conversation loop โ€” a single-turn implementation silently fails.

Ticketmaster APIAnthropic Web SearchSource DeduplicationServer-Side CacheFallback Events
Phase 04

Production Scaffold โ€” Building for Scale

Full Next.js 14 / TypeScript backend with modular source architecture, parallel fetching via Promise.allSettled, community submission endpoint, and Vercel deployment. API keys are server-side only throughout.

Next.js 14TypeScriptREST API RoutesVercel DeploymentIn-Memory Cache
06 โ€” Key learnings

What the process revealed

๐Ÿ”„

Two-Turn API Flows Are Non-Obvious

Anthropic's tool-use pattern requires a two-turn conversation loop. A single-turn implementation silently returns nothing โ€” a subtle failure mode that only rigorous testing catches.

๐Ÿ›ก๏ธ

Fallbacks Are a Feature, Not a Crutch

Hardcoded events ensure users never see a blank screen. Planning for API failure is as much a product decision as any feature โ€” resilience is designed in, not bolted on.

โœ‚๏ธ

Editing Is a Design Discipline

A wordmark, shimmer bar, borderless search input, and capacity indicator were all built and deliberately removed. The willingness to revert kept the interface clean and intentional.

07 โ€” Technology

Built with

Frontend / BackendNext.js 14
LanguageTypeScript
Events DataTicketmaster API
Community EventsAnthropic Web Search
DeploymentVercel
Caching (planned)Redis / Vercel KV
locale.
Product Design & Development
Sacramento, CA ยท MVP In Development