Schwarzwald Events, what Google doesn't know
Schwarzwald Events is one page with everything that happens around Rottweil, Villingen-Schwenningen and Balingen: concerts, village festivals, club nights, cinema times, church services, and the week's yoga, Pilates and martial-arts classes. Today it holds 5,480 dates from 104 sources in 71 towns.
It started in April as one agent pass over the regional tourist calendars. The rule from that first week is still in the handoff notes:
Datenqualität ist wichtiger als Präsentation.
Data quality matters more than how it looks.
Where the events actually are
The big calendars were the easy part. What they miss is what people go to. In July:
a lot of events are now advertised on instagram alsmost exclusively
A week later I handed it four festivals it had missed (a one-day electronic thing in Dormettingen, Bassaffekt in Balingen, the Waldfestival in Eningen, the Bergfest open air in Dürbheim) and asked for more than the four:
once you got those, reverse engineer how you could have found them on your own
So the sources are mostly small ones. A ticket site that blocks scripts still publishes its XML sitemap. A brass-band association's RSS feed covers about fifty village bands. Then there are Facebook event tabs, Instagram bios that list the next parties, and the weekly PDF gazettes the villages print. 1,209 of the dates came from a language model searching the web.
Narrower, and deeper
On 7 September the area got smaller on purpose:
let's try to narrow focus on Rottweil - VS - Balingen.... those 3 plus some bubble around them... [...] one hidden thing that is hard to find on the internet is the black forest run club.... you know stuff like that that google just doesn't know about
The plan was to walk Instagram's follow graph: start from accounts known to post events and see who they follow. The first run tried to open every single follower, and I stopped it:
ok I think you may be overdoing it looking at EVERY follower ... I think you could just pull metadata of follower count or even look at the name of accounts with a cheap model to decide if this is likely just a normal person or if it is an institution / someone well connected
The same evening the distance rule was set. Close to home, everything counts. Further out, only what is worth the drive:
the concerts worth driving for are like the katy perry jassfest earlier this year etc... so not the no name stuff
in the hyperlocal region everything is admitted, outside of that only name brands
The Black Forest Run Club is on the board now, on 1 November in Villingen. It came in through the model's web search.
Whose distance
In August:
I live in Dunningen now, which is nearer to Rottweil... but I wanted to make the site more mass marketable anyway, so... find a way to scrape the stuff near here as well and let people enter their zip code for distance estimation / calculation
So every date has a distance, counted from Dunningen unless you type a postcode or let the browser share your location. The page remembers whichever you chose.
The week's classes
The Kursplan tab lays every studio's week out in one timetable. The classes come from booking-system APIs, studio websites, and in one case a timetable that is only a picture, read by a vision model. In July it still showed each class only once:
after all you can assume that most slots repeat weekly. it seems right now you only assume they happen once which realy isnt how schedules usually work is it
- dates
- 5,480 in 71 towns, 439 venues and studios, 20 categories
- sources
- 104: calendars, sitemaps, RSS, ICS, PDFs, Facebook, Instagram, model web search
- page
- one static HTML file that loads a 2.6 MB events.json; no framework, no build step
- refresh
- full scrape weekly, cinemas every morning at six
- AI cost
- every model call goes through one budget module with a hard cap
Still rough
The cap is there because of July:
please stop all use of gemini api now.... there is something massively wrong with the cost exploding way too much
Since 28 August all 22 model-backed scrapers share one budget module that stops them at the cap. As of this morning they run on Claude instead of Gemini.
On a phone the header, the banner and the lists are wider than the screen.
A fifth of the board is a model's word for it. Since August a separate pass checks those dates for invented ones, and the board has a switch for entries that were never checked.
The page is in German only.