← All skills
WIP September 2026

Waste Calendar → Alexa

A system that turns the municipal recycling PDF calendars into Alexa voice reminders — "what do I take out tomorrow?" plus an automatic heads-up the evening before each collection.

Invocation: “Alexa, apri calendario rifiuti”

PythonAlexaAWS LambdaNode.jsPDF

The problem

Remembering which bin to put out each evening is a classic. My waste operator’s (SERIT) calendars are PDFs: fine to look at, useless to query by voice. I wanted to ask Alexa “what do I take out tomorrow?” and, better still, get an automatic reminder the night before.

A three-layer architecture

  1. Ingestion (offline) — download the SERIT PDFs and convert them into structured, validated JSON. This is the only layer that depends on the PDF layout.
  2. Normalised data — one file per town/zone/year plus a catalog.json index. Adding a town means adding files, without touching the skill.
  3. Alexa skill (Node / AWS Lambda) — answers by voice and schedules the evening reminders.

The PDF parser (the interesting part)

The SERIT PDFs have a nasty quirk: the day numbers are vector graphics, not text. So the parser reconstructs each date from the sequence of weekday names (which are text) plus the month and year, and then validates it against the expected weekday. If something doesn’t line up, the program exits with an error code — the signal that the PDF layout has changed and the parser needs revisiting. On the test files: zero mismatches.

The Alexa skill

The constraint that flipped the project

The first architecture created the reminders out of session: an EventBridge → Lambda → Messaging API chain was meant to wake the skill every evening and schedule the alert. It doesn’t work. Alexa forbids creating reminders outside a live user session and answers NOT_IN_SESSION — even when the skill is invoked through the messaging channel. A wrong assumption, disproved by the logs.

The fix is a “horizon” reminder: when you open the skill (or say “turn on reminders”), it schedules every collection for the next ~6 weeks in one go, each as a voice alert the evening before. Every time you open it, a top-up refills the missing weeks. The trade-off is upfront: it’s hands-off for about six weeks, after which reopening the skill renews the horizon.

Status

Phases 0–2 complete and the skill is live in production (PDF parser, voice commands, horizon reminders). The final in-app check of the reminders is still pending. Next phase: generalise to other SERIT towns and publish the skill to the Store.

Stack

Python (parser) · Node.js / Alexa ASK SDK · AWS Lambda · DynamoDB · Alexa Reminders API