An r/AnnArbor post hit 110 upvotes by aggregating events from many scattered sources. This walks the Scavio recipe for a single-city events aggregator.
Prerequisites
- Scavio API key
- Python or Node
- A curated 5-15 venue source list per city
- Static or simple Next.js front-end
Walkthrough
Step 1: Curate the venue source list
5-15 domains per city.
// domains = ['theark.org', 'thelivery.com', 'umich.edu/events', ...]Step 2: Per venue: Scavio site-search
Returns organic_results with title + URL + snippet.
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
for d in domains:
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H, json={'query': f'site:{d} events 2026'}).json()Step 3: Reddit signal per city
Surfaces community events the venue calendars miss.
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H, json={'query': 'reddit r/AnnArbor this weekend events 2026'}).json()Step 4: Normalize to typed JSON
{title, datetime, venue, url, category}.
# Per result: regex date + venue inference + category guess. Use LLM as fallback for ambiguous cases.Step 5: Deduplicate by URL + title fuzzy match
Many events appear on multiple venue feeds.
# Use rapidfuzz or LLM judge for the 5-10% fuzzy overlaps.Step 6: Daily cron
Runs at 6 AM local; updates static JSON.
# crontab: 0 6 * * * /usr/bin/python /app/aggregate.pyStep 7: Render as a clean public feed
No login.
// pages/[city].tsx → fetch /data/events-${city}.json → render list grouped by datePython Example
# Per-month: $30 Scavio + ~$5 hosting = under $40/mo for one city.JavaScript Example
// Same shape in Next.js + fetch.Expected Output
Daily-updated events feed at /CityName route. Mid-size city: ~600-1,000 normalized events/mo.