Bin day doesn't really apply to me — I just don't dump much, and I'm more of a keep-it-and-cache-it person than a chuck-it-out one. But bin-cal still made sense to wire up: I've got family in two other boroughs, the problem is real for plenty of people, and I'm overly into projects like this.
It's free. Type in your postcode and door number, get back a calendar URL, paste it into Apple Calendar, Google or Outlook, and bin day shows up automatically every week. No account, no email, no payment.
🗑 Try it
Live: elyobelyob.github.io/bin-cal
Source: github.com/elyobelyob/bin-cal
296 UK councils. Fork it and host your own if you'd rather.
How It Works
Three off-the-shelf bits, held together with bubblegum:
- GitHub Pages serves the address form.
- A Cloudflare Worker rate-limits and forwards the request to GitHub.
- A GitHub Action scrapes the council overnight, regenerates the calendar, and commits the resulting
.icsback into the repo.
Calendar URLs are keyed to a SHA-256 hash of the address — same address, same URL, always. The whole "database" is a calendars/ folder of tiny .ics files; the git log is the audit trail. Every night at 2 AM they regenerate.
The Upstream Did the Real Work
Honest disclosure: I didn't really build bin-cal so much as wrap an existing project. The council scrapers — the bit doing the actual work — come from mampfes/hacs_waste_collection_schedule, a Home Assistant integration that's been quietly cataloguing UK and worldwide bin scrapers for years. Bin-cal is a thin public, no-Home-Assistant-required wrapper around it: GitHub Pages form on the front, upstream scrapers doing the work, calendars dropped into a folder. That's why I can cover 296 councils without having scraped any of them myself — almost none of this is mine.
Three Fixes Along the Way
While wiring up bin-cal — and a year before — I hit three boroughs the upstream couldn't quite handle. So I sent fixes upstream.
#1 — Kingston (mine, the prequel)
The Royal Borough of Kingston upon Thames — the one with three silver salmon on its coat of arms, a nod to the Crown's medieval fishery on this stretch of the Thames — switched to an ICS calendar feed in early 2025, and the existing scraper still pointed at the old endpoint. I ripped it out and pointed users at the generic ics source instead.
PR #3900, merged March 2025. Just my own bins, on my own schedule. (#3815 and #3896 were earlier tries that didn't make it — the maintainers nudged me toward a cleaner approach the third time round.)
#2 — Mole Valley (for family)
A year later, wiring up bin-cal for family in Mole Valley District Council, I hit a wall: the upstream had no source at all. So I wrote one. Postcode → address search → HTML parse for refuse, recycling, garden and food.
PR #5889, merged 8 April 2026 — the same day I created the bin-cal repo. +305 lines, 10 files. Closed long-open issue #5038.
#3 — Kirklees (and a postcard from Sheffield)
Then something unexpected. My nephew Sam, watching the repo on GitHub from Sheffield, sent me this:
I figured it wouldn't be easy to put together because of how difficult Sheffield council make it to find the collection days. Super useful, and I've been wishing it existed for the last four months.
Sheffield wasn't a council I'd touched, fixed, or even thought about. It just worked, because the upstream already supported it and bin-cal hands off everything past the address form.
A lot of people don't really get open source — it puzzles them that you'd spend evenings on something free, anonymous, with no boss waiting on it. Sam, on the other side of GitHub, got it without having to ask, and that's why the message hit harder than a polite thank-you would have.
It also nudged me into doing one more. Sam's dad — my brother — lives in Kirklees, and the existing scraper had been broken for ages because the council migrated to a new my.kirklees.gov.uk JSON form-builder API. So I rewrote the whole thing end-to-end: cookies, auth-session SID, postcode lookup, property-type lookup, validated UPRN, collection dates.
PR #6167, merged 30 April 2026. +259 / -133 across two files. Breaking change for existing users (the config schema is different) but the scraper works again, and bin-cal can serve them too.
And while the PR was still open, an actual Kirklees resident — a GitHub user called Cadair — turned up on the thread and tested it themselves:
Thanks so much for fixing this, been thinking about doing it myself for ages. I've downloaded it and tested it works as a drop-in replacement with my existing config (after the uprn change).
Their config worked. The PR merged the next morning. That's the compounding effect: I sent in a fix for my brother's bins, and someone I've never met got their bins back too.
Want In?
If your council's scraper is broken or missing in the upstream, open an issue or send a PR — that's how the project stays alive. And if you just want bin reminders without setting up Home Assistant, elyobelyob.github.io/bin-cal is right there.
Hero image: coats of arms from Wikimedia Commons — Royal Borough of Kingston upon Thames by Cakelot1 (CC BY-SA 4.0); Mole Valley District Council by Jonas Magnus Lystad (CC0); Kirklees Metropolitan Borough Council (CC BY-SA 3.0).