Every company I worked at tracked leave differently. Spreadsheets, shared calendar invites buried under meeting noise, Slack messages that nobody checked. Some places had HR tools that were technically capable but so heavy that people avoided them. At some point I got tired of the problem being unsolved at the developer level and decided to build something I'd actually want to use.
The problem with existing tools
Most leave management software falls into one of two categories: too simple (a shared spreadsheet with some color coding) or too complex (an enterprise HR system that requires a three-day onboarding to configure). Neither fits a small engineering team that just wants to know who's off next week without pulling out a manual.
The simpler tools lack approval flows, Slack integration, or multi-country holiday support. The enterprise tools have all of that but come with a subscription fee and more configuration surface area than you want to maintain. I wanted something in the middle: self-hosted, open source, Symfony-based, and opinionated enough to work out of the box.
The stack
I've been building Symfony applications since 2015, so that part was an easy call. Symfony 7.4 on PHP 8.5 gives a solid foundation, and I'd rather extend something I understand deeply than learn a new framework for a side project.
The more interesting choice was using EasyAdmin for the entire UI, not just an admin panel, but the whole application. EasyAdmin handles CRUD operations, access control, and list views with very little code. For a leave management tool, that's almost all you need. There are rough edges when you push it beyond typical admin panel territory, but the productivity gains are worth the occasional workaround.
For testing, the project uses Pest with PHPStan at Level 8 and 75%+ code coverage. That level of coverage matters less for happy paths and more for catching edge cases around date calculations: overlapping leave requests, weekend exclusions, public holiday conflicts. Those are the things that break in production.
What it does
The core workflow is simple. An employee submits a leave request. A manager receives a Slack notification with approve and decline buttons. The team calendar updates. A weekly digest goes out on Monday morning so everyone knows who's out that week.
Beyond that: iCal export so you can subscribe in Google Calendar or Outlook, automatic public holiday imports via the Nager.Date API (supporting 100+ countries), four color palettes with light and dark mode, and role-based access with Admin, Manager, and User roles.
It's opinionated, and that's intentional. The goal was never to build a platform. It was to solve a specific, common problem with the minimum viable configuration.
Open source and self-hosted
I built this on my own, with the support of fortrabbit's CEO, and we now use it daily for the team. Making it open source felt right. The kind of tool that helps teams shouldn't be locked behind a SaaS subscription. AGPL-3.0 license, ready to run in minutes. We host it on fortrabbit, a PHP hosting platform I work at, for €4.5/month, but it runs anywhere with Docker Compose.
In closing
Who's OOO is on GitHub. If you're running a small team and tired of juggling spreadsheets and Slack threads, give it a try. If it's useful to you, a star on GitHub or a sponsorship helps keep the project going.