Getting Started
Installation
Try Who's OOO locally with Docker, then deploy it to fortrabbit or your own server
Deploy on fortrabbit (recommended)
The easiest way to run Who's OOO in production is on fortrabbit — a PHP hosting platform purpose-built for Symfony apps. No Docker required.
- Create a fortrabbit App — use the minimal stack configuration (€5/month) when selecting components in the app creation wizard
- Install the fortrabbit GitHub app on your GitHub account
- Connect your GitHub repository to the fortrabbit App — you can select an existing repo or create a new one during app setup
- Map your deployment branch (e.g.
main) to the fortrabbit environment - Configure your
.envvariables in the fortrabbit Dashboard - Deploy by pushing to your mapped branch — fortrabbit deploys automatically on each
git push, or you can trigger deployments manually through the Dashboard
fortrabbit's GitHub integration handles deployment pipelines with Composer and Node.js, intelligent caching for fast successive deployments, and comprehensive settings for deployment strategy, include/exclude patterns, and source directory configuration. We run our own Who's OOO instance on fortrabbit.
Whichever host you choose, a few steps from the Production Deployment guide apply everywhere:
- Create the first admin account. Production never loads demo data, so nobody can log in until you create an admin by hand.
- Run the background worker. Emails, auto-approvals, and scheduled jobs need one
messenger:consume scheduler_default scheduler_weekly_digest asyncprocess running, and only one. See Background workers. - Compile assets after each deploy when you're not using the Docker production image:
php bin/console asset-map:compile.
Try it locally with Docker
The quickest way to look around is the development stack. It boots with demo data, so you can log in straight away.
Warning: The development stack is built to be thrown away. Its entrypoint drops the database and reloads demo data every time the container starts. Never use it for real data. For a self-hosted production install, follow Production Deployment.
Prerequisites
| Tool | Version |
|---|---|
| Docker | 20+ |
| Docker Compose | 2+ |
| Git | any |
| just | any |
You don't need PHP, MySQL, Node, or Composer on your machine. Everything runs inside containers, and just start is a shortcut for docker compose up -d.
Clone and start
git clone https://github.com/igornast/who-is-out-of-office.git cd who-is-out-of-office just start
These services start:
| Service | Port | Description |
|---|---|---|
| nginx | 80 | Web server |
| php | — | PHP-FPM with Xdebug |
| worker | — | Sends emails and runs scheduled jobs (auto-approve, digest, …) |
| db | 3306 | MySQL 8.4 |
| mailer | 8025 | Mailpit, a local email catcher |
On first boot the PHP container installs Composer dependencies, waits for the database, runs migrations, and loads demo data. When the container logs show "Starting PHP-FPM", the app is ready.
The development stack only runs with APP_ENV set to dev or test. Anything else, for example APP_ENV=prod left in app/.env.local, stops the PHP container before it touches the database. For production, use the Production Deployment setup instead.
Log in
Open http://localhost/login in your browser. After logging in you land on the dashboard at /app/dashboard.
The login page
The demo data includes an account for every role:
| Role | Password | |
|---|---|---|
| Admin | admin@whoisooo.app | 123 |
| Manager | manager@whoisooo.app | 123 |
| User | user@whoisooo.app | 123 |
Warning: These accounts exist only in the development stack. Production never loads demo data, so you create the first admin yourself.
Dashboard overview
What you see on the dashboard depends on your role:
- Admin — full organization view: leave balance stats, all pending requests, who's out today, upcoming absences, birthdays, and work anniversaries.
- Manager — same sections, scoped to your direct reports.
- User — your personal leave balance, who's out today and this week, your upcoming absences, and organization-wide birthdays and work anniversaries.
The sidebar groups pages into sections: My Leave (your requests and the calendar), My Team (for managers and admins), Organization, Settings (admins only), and Account (profile, appearance, security).
The admin dashboard with all sections visible
Local email with Mailpit
The development stack includes Mailpit, a local email catcher. Every email the app sends (invitations, leave request notifications, password resets) is captured here instead of being delivered.
Open http://localhost:8025 to view caught emails.
Tip: No SMTP configuration needed for local development — Mailpit is pre-configured in the Docker setup.