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
Upgrading? Check the Upgrade Guide for breaking changes between versions before updating.
| 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, French, German, Italian, Spanish, Czech |
| PWA | Installable on mobile and desktop |
docker run -d \
-p 3000:3000 \
-v ./data:/app/data \
-v ./uploads:/app/public/uploads \
-e BETTER_AUTH_SECRET=$(openssl rand -base64 32) \
-e BETTER_AUTH_URL=http://localhost:3000 \
-e TZ=Europe/Berlin \
--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 |
| Enabling Auth on an Existing Instance | Turn on accounts for an instance that ran with AUTH_ENABLED=false |
| Upgrade Guide | Breaking changes between versions and the steps to get through them |
BETTER_AUTH_SECRET= # npx @better-auth/cli secret
BETTER_AUTH_URL=https://shifts.example.com # public URL, no trailing slashTZ=Europe/Berlin # without it the container runs on UTC
DEFAULT_LOCALE=en # cs, de, en, es, fr, it
AUTH_ENABLED=true # false serves everything publicly, without accounts
TRUSTED_PROXY_HEADER= # CF-Connecting-IP behind Cloudflare, X-Real-IP behind Caddy/nginxBehind a reverse proxy TRUSTED_PROXY_HEADER decides which header the real
client IP is read from. Rate limits and audit-log entries are keyed off it, so
leaving it wrong lumps every visitor into one bucket.
GOOGLE_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) |
Platform support:
linux/amd64only. Releases up to and includingv2.2.1were also published forlinux/arm64. Starting withv3.0.0, ARM images are no longer built — running BetterShift on ARM hardware (Raspberry Pi, Ampere, Apple Silicon) requires pinning tov2.2.1, which will not receive further updates.
| 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.











