The Challenge

Every household in Landsmeer needs to manage waste pickup according to a municipal schedule. While the municipality provides a paper calendar annually, the official online portal is difficult to use. It is hard to locate, requires 4 clicks to view pickup dates, uses a difficult URL, and offers no notification system. I developed this project to provide a more accessible tool for myself and for the residents of Gemeente Landsmeer but most importantly it's free to use.

The Approach

The goal was to create a focused web application where users could enter their zip code and house number to see their upcoming pickup dates immediately. As a user I want him to be able to simply visit the url https://afvalgids-landsmeer.nl/1121CC/7 and see his trash pickup calendar on his desktop or or use the PWA app. I wanted to build something simple. I didn't want to manage a database or a complex backend, so I used a lightweight stack: Node.js, Express, and plain JSON files for the address and schedule data. The goal was to keep the code simple enough that I could open it up and fix a bug in a few minutes if needed.

Implementation

1. Data Sourcing and Geocoding

To function, the application required a dataset of every address in Landsmeer mapped to specific pickup zones.

  • Address Data Collection: I scraped this data from a public online source using Puppeteer. I intend to cover the technical implementation of this scraping process in a future blog post.
  • Trash Data Collection: I scraped this data from the municipality’s public online sources manually from the pdf files. I converted this manually to JSON data for 5 different regions!
  • Mapping: Each address required latitude and longitude coordinates to match it to a pickup zone. I defined the pickup zone boundaries as polygons in regionCoordinates.json by first drawing them in Google Maps (see my Custom Map).
  • Logic: When a user enters an address, the server performs a point-in-polygon test to determine the user's zone and returns the corresponding schedule.

2. The Notification System

The project’s primary feature is the reminder system. I implemented Web Push via the browser's Notifications API, signed with VAPID keys, to avoid requiring user accounts.

  • Workflow: Users opt in through the site. The server stores the subscription object in subscriptions.json.
  • Scheduling: Two daily cron jobs (using node-schedule) trigger reminders at 19:00 (the day before) and 07:00 (on pickup day).
  • Platform Considerations: iOS does not support web push in standard Safari. Users must add the site to their home screen (installing the PWA) to enable push notifications. I implemented tracking for PWA installs to monitor and prompt iOS users to complete this step.

Maintenance and Constraints

  • Infrastructure: The project uses JSON files for addresses, schedules, and subscriptions rather than a database. This allows for updates via simple commits.
  • Logic Consistency: I use a single isInRegion function for both the cron jobs and the web interface to ensure the address-to-region logic remains synchronized.
  • Administration: An admin panel behind session authentication allows for manual, one-off push notifications, useful for unexpected schedule changes.

The Impact

After launching, I shared the tool in local Facebook and WhatsApp groups. The project has received regular use from residents. By focusing on a single, specific utility and avoiding unnecessary overhead, I created a tool that effectively addresses the primary frustration with the official municipal process.

afvalgids-landsmeer.nl social share image

Socials

Instagram story artboard 1Instagram story artboard 2Instagram story artboard 3
afvalgids-landsmeer.nl shown across Apple devices

Website: afvalgids-landsmeer.nl
Instagram: instagram.com/afvalgids.landsmeer
Facebook: facebook.com/afvalgidslandsmeer