Skip to content

Latest commit

 

History

167 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

logo

BetterShift

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.

Version Build License

Demo · Documentation · Quick Start · Discord

Upgrading? Check the Upgrade Guide for breaking changes between versions before updating.

Show Screenshots

Desktop

Calendar Presets Sharing Statistics Export External calendar sync Admin panel Login

Mobile

Calendar on mobile Settings on mobile Statistics on mobile Admin panel on mobile

Features

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

Quick Start

Docker

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:latest

Open http://localhost:3000. The first registered user becomes superadmin.

Docker Compose

git clone https://github.com/pantelx/bettershift.git
cd bettershift
cp .env.example .env
# Edit .env and set BETTER_AUTH_SECRET
docker compose up -d

From Source

git clone https://github.com/pantelx/bettershift.git
cd bettershift
npm install
cp .env.example .env
npm run db:migrate
npm run dev

Documentation

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

Configuration

Required

BETTER_AUTH_SECRET=          # npx @better-auth/cli secret
BETTER_AUTH_URL=https://shifts.example.com   # public URL, no trailing slash

Recommended

TZ=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/nginx

Behind 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.

Optional: OAuth Providers

GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=

GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=

DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=

Optional: Custom OIDC

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-configuration

See .env.example for all options.

Database Commands

npm run db:migrate    # Apply migrations
npm run db:generate   # Generate migrations after schema changes
npm run db:studio     # Open Drizzle Studio GUI

Docker Images

Images 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/amd64 only. Releases up to and including v2.2.1 were also published for linux/arm64. Starting with v3.0.0, ARM images are no longer built — running BetterShift on ARM hardware (Raspberry Pi, Ampere, Apple Silicon) requires pinning to v2.2.1, which will not receive further updates.

Tech Stack

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

Contributing

Contributions are welcome. Please follow these steps:

Fork the repository - Create a feature branch - Run npm test before committing - Submit a pull request

Support

Discord - GitHub Issues - Buy Me a Coffee - GitHub Sponsors

License

MIT License. See LICENSE for details.

About

Your favorite shift management application!

Topics

Resources

Stars

205 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages