- Period
- January 2023 — March 2023
- Role
- Fullstack Developer
- Website
- grofalex.nl
About the project
For any project that involves building, demolishing or changing the landscape you will be needing a permit of the local government. The permit requires you to prove that no protected animals — sparrows, bats, or other species — live at the location you want to build on. This is where Grofalex comes in. Grofalex arranges field workers to survey the location and report back, then uses that data to create a report for the permit application.
To send out field workers efficiently, Grofalex needed a planning tool that supports multiple organisations, each with their own set of locations and activities. Activities are typed and time-constrained — certain surveys must happen within a specific window — so the planning logic has to respect those rules when scheduling shifts. Field workers fill in their availability, and planners use a dedicated scheduling screen to assign workers to shifts, with the ability to filter by distance and by qualifications such as a driving licence. Multiple workers can be attached to a single shift, and changes stay in a pending state until explicitly published.
Once on location, workers can submit their survey reports directly in the tool. Reports go through an approval flow — they can be approved, rejected, or resubmitted — and shifts can be cancelled when outside factors make it necessary. At the end of the month, worked hours and travelled distances (calculated via the most optimal route) are aggregated per worker and made available for export to run payroll.
The tool was built using React, Node.js / Express and PostgreSQL with the PostGIS extension, running on a Linux server with Docker and Dokku. Dokku gives you a Heroku-like experience on your own server — auto deployments and rolling releases — at a fraction of the cost. Built solo in three months, it is one of the most complex and rewarding projects I have worked on.
What I learned
This project deepened my Node.js and Express knowledge substantially, including applying patterns from Laravel to structure the backend more maintainably. I used PostgreSQL with the PostGIS extension to calculate distances between workers and survey locations — something I hadn't worked with before and found genuinely interesting. On the mapping side, Mapbox powered the visual planning interface. Prisma handled the ORM layer cleanly, and I sharpened my TypeScript considerably under the pressure of a tight three-month timeline.
Screenshots








