Cal.rs
One Rust binary · Fully self-hostable · Open source

Scheduling that
respects your stack

Connect your CalDAV calendar, define bookable meetings, share a link. No Node.js, no PostgreSQL, no SaaS subscription. Just a single Rust binary.

calrs dashboard

Everything you need to schedule meetings

A complete scheduling platform that runs on your infrastructure. No vendor lock-in, no monthly fees.

📅

CalDAV sync

Pull events from Nextcloud, BlueMind, Fastmail, iCloud, Google, and more. Auto-discovery via RFC 4791. Write confirmed bookings back to your calendar. On-demand sync when guests visit your booking page — always fresh availability.

Availability engine

Free/busy computed from availability rules, synced calendar events, existing bookings, buffer times, and minimum notice. Date overrides let you block days off or set custom hours. RRULE expansion for recurring events.

🌐

Timezone aware

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.

📧

Email notifications

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.

👥

Groups & round-robin

OIDC group sync from Keycloak. Group event types with combined availability and automatic round-robin assignment to the least-busy member.

🔗

Ad-hoc team links

Create shareable booking links across hand-picked users — no admin-managed group needed. Finds slots where all selected members are free. Multiple availability windows (e.g. morning + afternoon). Reusable by default, editable after creation. CalDAV write-back to every member's calendar.

🔓

Private event types & invites

Hide event types from your public profile. Send personalized invite links with pre-filled guest info, expiration dates, and usage limits. Perfect for sales-qualified demos — reps send invites, the demo team's round-robin handles assignment.

🔄

Reschedule

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.

📆

Date overrides

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.

🔒

Security

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.

🎨

Theme engine

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 dynamic timezone labels and month calendar.

📦

Single binary

No runtime dependencies. SQLite storage in a single WAL-mode file. Ships as one binary — deploy with Docker, systemd, or just run it.

🛠

Full CLI

Manage everything headless: sources, sync, event types, bookings, users, SMTP config. Perfect for automation and scripting.

Tested & verified

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

CI codecov

🐳

Pre-built Docker images

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.

See it in action

A clean, focused booking experience for your guests and a powerful dashboard for you.

Bookings with human-friendly dates
Bookings — human-friendly dates
Time slot picker
Slot picker with timezone support
Event types
Event types
Booking form
Booking form
Calendar sources
Calendar sources
Add CalDAV source
Connect a CalDAV calendar
Team links
Ad-hoc team links
Event type editor
Event type editor
Admin dashboard
Admin panel
Availability troubleshoot
Availability troubleshoot
Profile and settings
Profile & settings
Public profile
Public booking profile
Reschedule slot picker
Reschedule slot picker
Reschedule confirmation
Reschedule confirmation
Light mode
Light mode
Light mode bookings
Light mode — bookings
Mobile dashboard
Mobile dashboard
Mobile bookings
Mobile bookings
Mobile slots
Mobile slots

Up and running in minutes

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

Built with boring, reliable technology

No JavaScript frameworks. No microservices. Just Rust, SQLite, and HTML templates.

🦀 Rust 🗃 SQLite (WAL) ⚡ Tokio 🔬 Axum 📄 Minijinja 📅 CalDAV (RFC 4791) 📧 Lettre (SMTP) 🔒 Argon2 + OIDC

Your time, your stack

Cal.rs is free, open source, and self-hostable. Star the repo, try it out, and join the community.