dayssinceohiocrash.com — Tracking every incident where a car has driven into a building in the Columbus, Ohio metro area.
Satirical. Sourced. Fully static. Costs nothing to run.
- A GitHub Actions cron job runs every morning at 8 AM ET
scripts/scraper.pysearches Google News RSS, Reddit, and Columbus PD/Fire pages for matching incidents- New candidates are added to
scripts/candidates.jsonand a pull request is opened for review - You review the PR, approve real incidents into
incidents.json, delete false positives - Merging the PR triggers a Netlify deploy — the counter and feed update automatically
- Go to app.netlify.com → Add new site → Import from GitHub
- Select this repo (
tonefox/days_since_ohio) - Build settings:
- Build command: (leave blank — pure static)
- Publish directory:
.
- Click Deploy
Netlify auto-deploys on every push to main.
In Netlify → Site settings → Domain management:
- Add custom domain:
dayssinceohiocrash.com - Netlify will give you nameservers to set at name.com
- Go to reddit.com/prefs/apps
- Click Create another app
- Type: script
- Name:
OhioCrashBot - Redirect URI:
http://localhost
- Copy the client ID (under the app name) and client secret
In your GitHub repo → Settings → Secrets and variables → Actions → New repository secret:
| Secret name | Value |
|---|---|
REDDIT_CLIENT_ID |
your Reddit app client ID |
REDDIT_CLIENT_SECRET |
your Reddit app client secret |
The scraper runs without Reddit credentials (falls back to Google News + PD/Fire only), but Reddit adds significant signal.
- Go to favicon.io/emoji-favicons
- Search for "collision" or use 🚗
- Download and place in the repo root:
icon-192.pngicon-512.pngfavicon.ico
When the scraper opens a PR:
Option A — via GitHub (remote):
- Open the PR → review
scripts/candidates.json - Edit the file: fill in
location,city,county,building_type,status,injuries,funny_note - Move approved objects into
incidents.json(assign a sequentialid) - Delete false positives from
candidates.json - Merge the PR
Option B — locally (faster):
git pull
python scripts/approve.py # interactive CLI walks you through each candidate
python scripts/generate_feed.py
git add incidents.json scripts/candidates.json feed.xml
git commit -m "approve: add incident #N"
git pushEdit incidents.json directly:
{
"id": 9,
"date": "2026-04-11",
"location": "Polaris Pkwy Starbucks",
"city": "Columbus",
"county": "Franklin",
"building_type": "Restaurant",
"headline": "Car drives into Polaris Starbucks; barista finishes order",
"funny_note": "The car was not in the mobile order lane. The car is now in the lobby.",
"source_url": "https://www.nbc4i.com/...",
"source_name": "NBC4i Columbus",
"injuries": "none",
"status": "plywood_phase",
"reddit_thread": null
}status options: rebuilt | plywood_phase | condemned
Then run python scripts/generate_feed.py and push.
ohio-crash-watch/
├── index.html — main page (counter + feed)
├── about.html — satire disclaimer + tip submission
├── incidents.json — approved incidents (source of truth)
├── feed.xml — RSS feed (auto-generated)
├── manifest.json — PWA manifest
├── sw.js — service worker (offline support)
├── netlify.toml — headers, cache rules, Netlify Forms
├── .github/
│ └── workflows/
│ └── daily-scrape.yml — cron job + PR creation
scripts/
├── scraper.py — fetches candidates from 3 sources
├── approve.py — interactive CLI for reviewing candidates
├── generate_feed.py — generates feed.xml from incidents.json
├── candidates.json — pending review (never deployed)
└── requirements.txt
| Layer | Choice | Cost |
|---|---|---|
| Hosting | Netlify | Free |
| CI/CD | GitHub Actions | Free |
| Reddit API | PRAW + free OAuth app | Free |
| Google News RSS | feedparser | Free |
| Police/Fire scraping | requests + BeautifulSoup | Free |
| Domain | name.com | ~$12/yr |
| Total | ~$12/yr |
This site is satirical. All incidents are real and sourced from public reporting. We do not publish personal information about drivers or anyone involved. See about.html for full methodology and inclusion criteria.