Connect your CalDAV calendar, define bookable meetings, share a link. No Node.js, no PostgreSQL, no SaaS subscription. Just a single Rust binary.
A complete scheduling platform that runs on your infrastructure. No vendor lock-in, no monthly fees.
Pull events from Nextcloud, BlueMind, Fastmail, iCloud, and more. Auto-discovery via RFC 4791. Write confirmed bookings back to your calendar. Delta sync via RFC 6578 sync-token — only fetches changes, not your entire calendar. Scales to hundreds of users. Background sync catches deletions even when nobody's booking.
Free/busy computed from availability rules, synced calendar events, existing bookings, buffer times, and minimum notice. Configurable slot interval decouples start-time spacing from meeting duration — put 20-minute meetings on the half-hour. Date overrides let you block days off or set custom hours. RRULE expansion for recurring events.
Guest timezone auto-detected from the browser. Calendar events are converted from their original timezone to yours — a 10:00 New York meeting correctly blocks 16:00 in Paris. Full IANA timezone database support.
HTML emails with .ics calendar invites. Approve or decline pending bookings directly from the email — no login required. Guests can invite additional attendees who receive their own confirmation with ICS.
Create teams from OIDC groups, hand-picked users, or both. Round-robin assigns to the least-busy available member with configurable priority weights. Collective requires all members to be free. Team avatars and stacked member photos on booking pages. Global admins can set up teams without being bookable.
Combine usernames in a URL (/u/alice+bob/intro) for instant collective meetings — no team setup needed. All participants' calendars are intersected. Autocomplete user picker in the event type editor, opt-out toggle in settings. Co-participants added as CalDAV attendees.
Designate a team as watchers on an event type. When a booking lands, watchers are emailed with a tokenized link to claim it — first-come wins, no double-assignment. Claimed bookings show up on the watcher's dashboard. Perfect for support rotations and account-management teams.
Public — listed on your profile, anyone can book. Internal — any authenticated colleague generates single-use invite links from the Invite Links page. Private — only you send invite links. Works for both personal and team event types. One-click link generation with clipboard copy.
Guests and hosts can reschedule bookings without cancelling. Guests pick a new slot and the host approves; hosts reschedule instantly. CalDAV events updated in place, tokens regenerated, both parties notified.
Block specific dates or set custom hours per event type. Perfect for holidays, conferences, or one-off schedule changes. Overrides replace your weekly rules for that day — the troubleshoot view shows when they're active.
Guests switch between month grid, week columns, and column list views on the slot picker. Preference is remembered. Hosts set the default view per event type.
Cap bookings per day, week, month, or year — combine multiple limits. Enable "one slot per day" to show only the earliest available time each day, perfect for daily standups or check-ins.
Argon2 password hashing, OIDC SSO with PKCE, AES-256-GCM encrypted credentials at rest. Hidden password input. Auto-generated secret key or bring your own via environment variable.
7 built-in themes (Default, Nord, Dracula, Gruvbox, Solarized, Tokyo Night, Vates) plus custom colors — all configurable from the admin dashboard. Every theme adapts to both dark and light modes. Cal.com-style slot picker with switchable month/week/column views.
No runtime dependencies. SQLite storage in a single WAL-mode file. Ships as one binary — deploy with Docker, systemd, or just run it. Fonts are bundled — no Google Fonts CDN, no third-party requests. Fully GDPR-compliant out of the box.
Manage everything headless: sources, sync, event types, bookings, users, SMTP config. Perfect for automation and scripting.
500+ automated tests covering web handlers, CLI commands, auth lifecycle, availability engine, slot computation, database migrations, RRULE expansion, iCal parsing, timezone conversion, and email rendering. Every commit is checked by CI with code coverage tracking.
Multi-arch images for amd64 and arm64 published to GitHub Container Registry on every release. No build step — just docker pull and run. Works on Raspberry Pi, Apple Silicon, and ARM cloud instances.
A clean, focused booking experience for your guests and a powerful dashboard for you.
Pick your preferred method. The first user to register becomes admin.
# Pre-built image from GHCR (amd64 + arm64) docker run -d --name calrs \ -p 3000:3000 \ -v calrs-data:/var/lib/calrs \ -e CALRS_BASE_URL=https://cal.example.com \ ghcr.io/olivierlambert/calrs:latest # Open http://localhost:3000 and register
# docker-compose.yml services: calrs: image: ghcr.io/olivierlambert/calrs:latest ports: - "3000:3000" volumes: - calrs-data:/var/lib/calrs environment: - CALRS_BASE_URL=https://cal.example.com restart: unless-stopped volumes: calrs-data:
# Build from source cargo build --release # Install binary + templates sudo cp target/release/calrs /usr/local/bin/ sudo cp -r templates /var/lib/calrs/templates # Create system user and start sudo useradd -r -s /bin/false -m -d /var/lib/calrs calrs sudo cp calrs.service /etc/systemd/system/ sudo systemctl enable --now calrs
# Clone and run from source git clone https://github.com/olivierlambert/calrs.git cd calrs cargo build --release ./target/release/calrs serve --port 3000 # Register at http://localhost:3000
No JavaScript frameworks. No microservices. Just Rust, SQLite, and HTML templates.
Cal.rs is free, open source, and self-hostable. Star the repo, try it out, and join the community.