Your favorite shift management application!
BetterShift is a self-hosted shift management application for teams and individuals with variable work schedules. Create unlimited calendars, toggle shifts with a single click, and share them with your team via user accounts, links, or public access. Sync external calendars from Google, Outlook, or iCal, export to ICS/PDF, and manage everything through an admin panel with role-based permissions and audit logging.
Demo · Documentation · Quick Start · Discord
| Feature | Description |
|---|---|
| Calendars | Unlimited calendars with custom colors and names |
| Presets | Reusable shift templates with labels, times, and colors |
| External Sync | Subscribe to Google Calendar, Outlook, or iCal feeds |
| Sharing | Share via user accounts, guest access, or shareable links |
| Authentication | Email/password, OAuth (Google, GitHub, Discord), or custom OIDC |
| Admin Panel | User management, calendar administration, audit logging |
| Statistics | Real-time shift tracking with visual charts |
| Export | Download calendars as ICS or PDF |
| Localization | English, German, Italian |
| PWA | Installable on mobile and desktop |
docker run -d \
-p 3000:3000 \
-v ./data:/app/data \
-e BETTER_AUTH_SECRET=$(openssl rand -base64 32) \
-e BETTER_AUTH_URL=http://localhost:3000 \
--name bettershift \
ghcr.io/pantelx/bettershift:latestOpen http://localhost:3000. The first registered user becomes superadmin.
git clone https://github.com/pantelx/bettershift.git
cd bettershift
cp .env.example .env
# Edit .env and set BETTER_AUTH_SECRET
docker-compose up -dgit clone https://github.com/pantelx/bettershift.git
cd bettershift
npm install
cp .env.example .env
npm run db:migrate
npm run dev| Document | Description |
|---|---|
| Authentication Setup | Email/password, OAuth, OIDC configuration |
| Admin Panel | User management, calendar administration |
| Permissions | Sharing, access tokens, guest access |
| Migration Guide | Enable auth on existing instances |
AUTH_ENABLED=true
BETTER_AUTH_SECRET= # npx @better-auth/cli secret
BETTER_AUTH_URL=http://localhost:3000GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=CUSTOM_OIDC_ENABLED=true
CUSTOM_OIDC_NAME=Company SSO
CUSTOM_OIDC_CLIENT_ID=
CUSTOM_OIDC_CLIENT_SECRET=
CUSTOM_OIDC_ISSUER=https://sso.example.com/.well-known/openid-configurationSee .env.example for all options.
npm run db:migrate # Apply migrations
npm run db:generate # Generate migrations after schema changes
npm run db:studio # Open Drizzle Studio GUIImages are available at ghcr.io/pantelx/bettershift:
| Tag | Description |
|---|---|
latest |
Latest stable release |
vX.Y.Z |
Specific version |
dev |
Development build (unstable) |
| Layer | Technology |
|---|---|
| Framework | Next.js 16, React 19, TypeScript |
| Database | SQLite, Drizzle ORM |
| Auth | Better Auth |
| UI | Tailwind CSS, shadcn/ui, Radix UI |
| i18n | next-intl |
Contributions are welcome. Please follow these steps:
Fork the repository -
Create a feature branch -
Run npm test before committing -
Submit a pull request
Discord - GitHub Issues - Buy Me a Coffee - GitHub Sponsors
MIT License. See LICENSE for details.

