Modern Leave Management for Teams
GDPR-compliant absence management built for the modern workplace. Free for non-commercial use.
Features β’ Demo β’ Quick Start β’ Deployment β’ Contributing β’ License
Managing employee leave shouldn't require expensive enterprise software or endless Excel spreadsheets. ZeitPal is a free for non-commercial use solution that makes leave management simple, transparent, and compliant with European data protection regulations.
Free for teams up to 20 employees β no credit card, no hidden fees.
- Save 5+ hours per month on administrative tasks
- Setup in under 15 minutes β no training required
- 100% GDPR compliant β data hosted in the EU
- German labor law support β including state-specific holidays
| Feature | Description |
|---|---|
| Leave Requests | Submit and approve leave requests with one click |
| Team Calendar | Visual overview of team availability and absences |
| Sick Leave | Digital sick leave reporting with certificate reminders |
| Leave Balances | Automatic calculation of remaining days, carryover, and pro-rata |
| Approval Workflows | Flexible approval chains for different absence types |
| Notifications | Email and Slack notifications for requests and approvals |
- Advanced reports and analytics
- Multiple team management
- Slack and Google Calendar integration
- Custom leave types
- Priority support
- SSO/SAML authentication
- API access
- Dedicated account manager
- SLA guarantee
- On-premise deployment option
π Live Demo: https://zeitpal.com
ZeitPal is built with modern, production-ready technologies:
| Technology | Purpose |
|---|---|
| Next.js 15 | React framework with App Router |
| TypeScript | Type-safe JavaScript |
| Tailwind CSS v4 | Utility-first CSS framework |
| Supabase | PostgreSQL database & authentication |
| Turborepo | Monorepo build system |
| Shadcn UI | Accessible component library |
| i18next | Internationalization (DE/EN) |
| React Query | Data fetching and caching |
| Zod | Schema validation |
| Playwright | End-to-end testing |
- Node.js 18.x or later
- Docker (for local Supabase)
- pnpm (package manager)
# Clone the repository
git clone https://github.com/cderinbogaz/zeitpal.git
cd zeitpal
# Install dependencies
pnpm install
# Start Supabase (requires Docker)
pnpm run supabase:web:start
# Start the development server
pnpm run devOpen http://localhost:3000 to see ZeitPal running.
Access the local Supabase dashboard at http://localhost:54323 to manage your database.
zeitpal/
βββ apps/
β βββ web/ # Next.js application
β βββ app/
β β βββ (marketing)/ # Public marketing pages
β β βββ auth/ # Authentication pages
β β βββ home/ # Protected app pages
β βββ supabase/ # Database & migrations
β βββ config/ # App configuration
β
βββ packages/
β βββ ui/ # Shared UI components
β βββ features/ # Core feature packages
β βββ auth/ # Authentication logic
β
βββ docs/ # Documentation
Create a .env.local file in apps/web/ with:
# Site Configuration
NEXT_PUBLIC_SITE_URL=http://localhost:3000
NEXT_PUBLIC_PRODUCT_NAME=ZeitPal
# Supabase (local defaults)
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
# Theme
NEXT_PUBLIC_DEFAULT_THEME_MODE=light
NEXT_PUBLIC_THEME_COLOR=#7c3aedSee Environment Variables for the full list.
# Build for production
pnpm run build
# Deploy to Cloudflare
npx wrangler pages deploy apps/web/.nextdocker build -t zeitpal .
docker run -p 3000:3000 zeitpal- Create a Supabase project
- Push migrations:
pnpm --filter web supabase db push - Set callback URL:
<your-url>/auth/callback - Update environment variables
# Development
pnpm run dev # Start development server
# Code Quality
pnpm run lint # Run ESLint
pnpm run format:fix # Format code with Prettier
pnpm run typecheck # TypeScript validation
# Database
pnpm run supabase:web:start # Start local Supabase
pnpm run supabase:web:stop # Stop local Supabase
pnpm run supabase:web:reset # Reset database
pnpm run supabase:web:typegen # Generate TypeScript types
# Testing
pnpm run test # Run testspnpm --filter web supabase migration new --name <migration-name>
pnpm run supabase:web:resetWe love contributions! ZeitPal is a source-available project and we welcome developers of all skill levels.
- Fork the repository
- Clone your fork:
git clone https://github.com/cderinbogaz/zeitpal.git - Create a branch:
git checkout -b feature/amazing-feature - Make your changes
- Test your changes:
pnpm run lint && pnpm run typecheck - Commit:
git commit -m 'Add amazing feature' - Push:
git push origin feature/amazing-feature - Open a Pull Request
Looking for a place to start? Check out issues labeled good first issue.
- Follow the existing code style
- Write meaningful commit messages
- Add tests for new features
- Update documentation as needed
- Keep PRs focused and small
- Mobile app (React Native)
- Calendar integrations (Outlook, Apple Calendar)
- HR system integrations (Personio, HRworks)
- AI-powered leave suggestions
- Multi-language support (FR, ES, IT)
- Advanced analytics dashboard
See the open issues for a full list of proposed features.
- Discussions: GitHub Discussions
- Issues: GitHub Issues
- Documentation: docs.zeitpal.com
- Email: support@zeitpal.com
- Enterprise: enterprise@zeitpal.com
ZeitPal is free for non-commercial use. If you find it useful, please consider sponsoring:
This project is licensed under a Non-Commercial License β free for personal and educational use. For commercial use, please contact enterprise@zeitpal.com. See the LICENSE file for details.
Built with love using:
- MakerKit β SaaS starter template
- Shadcn UI β Component library
- Supabase β Backend infrastructure
β Star this repo if you find ZeitPal useful!
Made with β€οΈ in Germany



