Cincinnati has a lot going on. History lectures at the Cincinnati Museum Center, archaeological tours through Fort Ancient, craft workshops at local makerspaces, film screenings, nature programs, WWII aviation days at the National Museum of the Air Force, earthworks tours at Hopewell Culture. The problem isn't a shortage of events. It's that they're scattered across dozens of individual websites, each with its own calendar format, update cadence, and degree of crawlability.
No single place aggregates them. The city's general event sites tend toward concerts and festivals. The niche stuff — the history talks, the guided walks, the lecture series at small museums — lives on individual institution websites and dies there.
Horizon is my attempt to fix that for myself.
How It Works
Every Sunday morning a GitHub Actions cron job kicks off the scraper. It works through a growing list of sources: history museums, nature centers, archaeological sites, art venues, community theaters, and local institutions across Cincinnati, Northern Kentucky, and the Dayton area.
Sources
20th Century Theater·American Sign Museum·ArtsConnect·Asian Food Fest·Augusta, KY Community Events·Behringer-Crawford Museum·Brewing Heritage Trail·Cincinnati & Hamilton County Public Library·Cincinnati Arts — Aronoff Center / Music Hall·Cincinnati Bengals·Cincinnati Cyclones·Cincinnati Food Tours·Cincinnati Nature Center·Cincinnati Parks·Cincinnati Preservation·Cincinnati Reds·Cincinnati Symphony Orchestra / Cincinnati Pops·Cincinnati Zoo & Botanical Garden·City of Bellevue, KY·Civic Garden Center·Contemporary Arts Center·Eckstein Cultural Arts Center·Esquire Theatre·Filson Historical Society·Fort Ancient Earthworks·Great Parks of Hamilton County·Heart of Northside·Holocaust and Humanity Center·ICON Festival Stage at The Banks·Keep Cincinnati Beautiful·Know Theatre of Cincinnati·Lloyd Library and Museum·Madison Theater·Memorial Hall OTR·Milford Historical Society·Mt. Adams Civic Association·National Underground Railroad Freedom Center·Northside Tavern·Over-the-Rhine Museum·Rabbit Hash General Store·Riverbend Music Center·Serpent Mound·Sharonville Convention Center·The Betts House·The Children's Theatre of Cincinnati·The Manufactory·US Grant Birthplace·Vent Haven Museum·William Howard Taft National Historic Site·Woodward Theater·20th Century Theater·American Sign Museum·ArtsConnect·Asian Food Fest·Augusta, KY Community Events·Behringer-Crawford Museum·Brewing Heritage Trail·Cincinnati & Hamilton County Public Library·Cincinnati Arts — Aronoff Center / Music Hall·Cincinnati Bengals·Cincinnati Cyclones·Cincinnati Food Tours·Cincinnati Nature Center·Cincinnati Parks·Cincinnati Preservation·Cincinnati Reds·Cincinnati Symphony Orchestra / Cincinnati Pops·Cincinnati Zoo & Botanical Garden·City of Bellevue, KY·Civic Garden Center·Contemporary Arts Center·Eckstein Cultural Arts Center·Esquire Theatre·Filson Historical Society·Fort Ancient Earthworks·Great Parks of Hamilton County·Heart of Northside·Holocaust and Humanity Center·ICON Festival Stage at The Banks·Keep Cincinnati Beautiful·Know Theatre of Cincinnati·Lloyd Library and Museum·Madison Theater·Memorial Hall OTR·Milford Historical Society·Mt. Adams Civic Association·National Underground Railroad Freedom Center·Northside Tavern·Over-the-Rhine Museum·Rabbit Hash General Store·Riverbend Music Center·Serpent Mound·Sharonville Convention Center·The Betts House·The Children's Theatre of Cincinnati·The Manufactory·US Grant Birthplace·Vent Haven Museum·William Howard Taft National Historic Site·Woodward Theater·
American Legacy Tours·Archaeological Research Institute·ArtWorks Cincinnati·Augusta Distillery·Beehive Augusta Tavern·Bogart's·Butler County Warbirds Museum·Cincinnati Art Museum·Cincinnati Ballet·Cincinnati Black Music Walk of Fame·Cincinnati Fire Museum·Cincinnati Museum Center·Cincinnati Observatory·Cincinnati Playhouse in the Park·Cincinnati Pride·Cincinnati Shakespeare Company·Cincinnati World Cinema·Cincy A&E·City of Blue Ash / Summit Park·Clifton Cultural Arts Center·Covedale Center for the Performing Arts·Ensemble Theatre Cincinnati·FC Cincinnati·Findlay Market·Gorman Heritage Farm·Harriet Beecher Stowe House·Heritage Village Museum·Howard Steamboat Museum·Imperial Theatre Mohawk Arts Center·Kentucky Historical Society·Lebanon Mason & Monroe Railroad·Loveland Castle & Museum·MadTree Brewing·Mercantile Library·Movers and Makers·National Museum of the U.S. Air Force·Newport Aquarium·Ohio History Connection·Pyramid Hill Sculpture Park & Museum·RAPTOR Inc.·Riverfront Live·Shaker Village of Pleasant Hill·Taft Museum of Art·The Carnegie·The Comet·Tri-State Warbird Museum·US Grant Boyhood Home·White Water Shaker Village·Woodcraft Cincinnati·American Legacy Tours·Archaeological Research Institute·ArtWorks Cincinnati·Augusta Distillery·Beehive Augusta Tavern·Bogart's·Butler County Warbirds Museum·Cincinnati Art Museum·Cincinnati Ballet·Cincinnati Black Music Walk of Fame·Cincinnati Fire Museum·Cincinnati Museum Center·Cincinnati Observatory·Cincinnati Playhouse in the Park·Cincinnati Pride·Cincinnati Shakespeare Company·Cincinnati World Cinema·Cincy A&E·City of Blue Ash / Summit Park·Clifton Cultural Arts Center·Covedale Center for the Performing Arts·Ensemble Theatre Cincinnati·FC Cincinnati·Findlay Market·Gorman Heritage Farm·Harriet Beecher Stowe House·Heritage Village Museum·Howard Steamboat Museum·Imperial Theatre Mohawk Arts Center·Kentucky Historical Society·Lebanon Mason & Monroe Railroad·Loveland Castle & Museum·MadTree Brewing·Mercantile Library·Movers and Makers·National Museum of the U.S. Air Force·Newport Aquarium·Ohio History Connection·Pyramid Hill Sculpture Park & Museum·RAPTOR Inc.·Riverfront Live·Shaker Village of Pleasant Hill·Taft Museum of Art·The Carnegie·The Comet·Tri-State Warbird Museum·US Grant Boyhood Home·White Water Shaker Village·Woodcraft Cincinnati·
The single biggest challenge is that every organization presents events differently. One site uses a full calendar widget. Another lists them as plain bullet points. Another publishes a separate page per event with no index. There's no standard. So rather than one generic extractor, the scraper has a shared framework with a custom module for each source — each one written specifically for how that site structures its data. Almost every module is meaningfully different from the last.
For each source, the appropriate module fetches the HTML. For sites that require JavaScript to render — which is most of them — it uses Playwright to get the fully rendered page first. That HTML goes to Gemini Flash, which extracts structured event data: title, date, time, location, categories, cost, and a short description. Gemini Flash was a deliberate choice: its large context window handles dense calendar pages cleanly, and the cost per extraction is low enough to run the full source list weekly without it adding up.
Extracted events are written to the database. A separate enrichment workflow runs afterward to fill in missing fields — coordinates, venue details, category tags — where the initial extraction left gaps.
Database Storage
Events are stored in a database and consolidated into a static manifest at build time. Each record carries a version tag from the scrape batch that created it.