A personal event discovery engine for Atlanta, built with Claude Code. Every event scored 0-100 against a real taste profile. No algorithms deciding what's popular — just what's worth your time.
On Dima's Radar started as a question: "What's worth going to this month?" Existing event sites surface everything — this one filters for one specific taste. The result is a zero-backend static site where every event is scored against a personal taste profile covering genre affinity, venue quality, format rarity, lineup strength, and value.
Each event gets a 0–100 Dima Score across 5 axes. No binary "interested / not interested" — everything stays in context with a clear signal of how well it matches.
A weekly Claude job sweeps venue calendars, museum listings, and Atlanta newsletters, scores what it finds, enriches images and ticket links, and deploys — unattended.
index.html, data.js, style.css, app.js. No framework, no build step, no database. State (RSVPs, invites) rides in localStorage and the URL.
Beyond timed events — parks, museums, playgrounds, date nights, rainy-day escapes. Geocoded on the map with effort, cost, and separate kid and parent scores.
The scoring engine is calibrated to a specific set of preferences — not a generic popularity metric. Here's what moves the needle.






















Smaller, unique venues over massive arenas. Focus on artistic merit and sound design.
Five axes, each scored 0–100, combined into the single number on every card. The spider chart in an event's detail drawer plots exactly these five.
Scores are a ranking aid, not a verdict — a 72 with the right people beats an 88 on a night that doesn't work.
Events fit into a personal energy cadence — balancing high-intensity catharsis with recovery and family time.
Sol Dance / ecstatic dance for a physical and social recharge.
One major electronic show a month. The high-energy peak.
Zoo, Botanical Garden, Fernbank — repeatable with small kids, twice a month.
Library storytime, playgrounds, neighborhood walks. Weekly.
Built entirely with Claude Code, no manual data entry — every event discovered, scored, enriched, and deployed through an AI-assisted pipeline. What started as a single-session build turned into a side project that now largely runs itself: a scheduled agent keeps the data current whether or not anyone opens the repo.
The part that changed everything: this isn't a script I run, it's a scheduled job. A headless Claude session wakes up on a timer, reads its own venue playbook, sweeps the Tier-1 music venues plus museum and family calendars, diffs what it finds against the existing dataset, scores anything new against the taste profile, enriches images and ticket links, writes it into the data file, and deploys — unattended. A second daily job watches a personal inbox lane: newsletters, self-sent screenshots of flyers, and texted links all get parsed into event candidates the same way.
Scoring isn't a vibe check — it's calibrated against 15 years of actual listening and going-out history: Spotify streams, a reconstructed concert log, venue preferences, and the family constraints that decide what's realistically doable. Each event lands a 0–100 Dima Score built from the five axes above, with the breakdown visible as a spider chart in every event's drawer.
The Browse grid handles type, score tier, and venue sorting, plus a threshold slider that surfaces near-misses that didn't make the curated cut. The same panel folds in When? Who? Vibe? filtering — originally a separate 3-tap wizard, now real filter chips that narrow both the event grid and the evergreen list together, for the faster "what's actually the move" answer.
A separate library of 140+ repeatable, no-ticket activities — parks, museums, date nights, family spots — for the "we're free, no plan" moments a ticketed-events feed can't answer. Started as a plain filtered list; grew a freeform finder ("free Sat morning, indoors, or at home?") that does loose keyword matching against name, description, and notes, plus day/time/effort/availability filters tucked behind a disclosure so the default view stays uncluttered.
A Leaflet map layers events (tier-colored) and evergreen activities (green) with category filters and hover tooltips. A month-grid calendar mirrors the same dataset with recurring-event markers, so the same underlying data reads geographically or chronologically depending on what you're actually trying to decide.
The share flow started as a bare checkbox list of events. It grew into one combinable invite link that mixes specific events, an evergreen activity proposed for a date, and open "just tell me when you're free" time slots — all encoded straight into the URL. No accounts, no server: a friend opens the link, taps Yes/Maybe/Pass on whatever's in it, and copies a reply back.
Every feature above was built with Claude Code and iterated across dozens of rounds against real usage. Most of the actual bugs only surfaced by using the live site, not by reading the code: a "show all" button that silently never appeared, events dropping off the grid after dark (UTC-vs-local date parsing), an apostrophe in one event title breaking the whole JSON export, and a deploy path that kept "succeeding" into a dead legacy URL after the site moved to its current home. The repo now carries a regression checklist for exactly those classes.
The companion project — and the source of the taste data behind every score on this site. Fifteen years of listening history broken down by era, genre, and mood.
dima-spotify.vercel.app →
Every venue calendar, museum listing, and Atlanta newsletter in the sweep. Coverage below is computed from the current dataset each time this page loads.
Swept weekly. Only shows that clear the taste profile get added, so these counts are deliberately far below each venue's full calendar.
Where the kid-friendly and date-night inventory comes from. Several are membership venues, flagged on the event cards.
Parsed from a dedicated inbox and RSS. These catch the one-off stuff no venue calendar lists — festivals, markets, pop-ups, free kid events.