Open source · Self-hosted · Your infrastructure

Scheduling
without the
middleman.

Schedra is an open-source booking platform you run yourself. One container, one Postgres, ten environment variables. Your calendar data never touches anyone else's infrastructure.

Runtime deps
Postgres
Setup
One command
Seat pricing
None

Real widget — pick a slot

  • Own your data
  • Postgres only
  • No Redis
  • DST-safe engine
  • One container
  • Zero telemetry

Features

Everything a scheduling tool owes you.

No feature held back for a paid tier. If it ships, you can run it.

01

Event types

One-on-one, group, round-robin and collective. Custom durations, locations and questions.

02

Availability

Weekly hours, date overrides, buffers, minimum notice, booking windows and daily caps.

04

Calendar sync

Google, Outlook and CalDAV. Two-way, conflict-aware, and reconciled in the background.

06

Timezones done right

IANA zones, never raw offsets. DST transitions are handled explicitly and tested.

07

Booking pages

Server-rendered, keyboard-accessible and fast. Brand them, embed them, or both.

09

Teams

Organizations, roles, shared availability and fair round-robin. Not an enterprise upsell.

11

API & webhooks

REST with an OpenAPI spec, signed webhooks with retries, and an embeddable widget.

12

Notifications

Confirmations, reminders, reschedules and cancellations through any SMTP server.

The engine

One meeting.
Every timezone.
Correct.

Most scheduling bugs are timezone bugs, and they are silent — a booking lands an hour off on the one Sunday a year the clocks move. Schedra stores recurring hours as wall-clock time plus an IANA zone, never as a fixed offset, and resolves them through an engine with no database access and no HTTP.

Stored
09:00 + Africa/Lagos — a wall clock and a place
Never stored
+01:00 — offsets change twice a year, zones don't
Same instant 2026-08-18T22:30:00Z

Lagos

Africa/Lagos

WAT · UTC+1

23:30

Tue 18 Aug

London

Europe/London

BST · UTC+1

23:30

Tue 18 Aug

New York

America/New_York

EDT · UTC−4

18:30

Tue 18 Aug

Tokyo

Asia/Tokyo

JST · UTC+9

07:30

Wed 19 Aug

Tokyo is already on the next day. The engine resolves this before a slot is ever offered.

Tested against

  • Spring-forward — 02:30 does not exist
  • Fall-back — 01:30 happens twice
  • Overnight window crossing midnight
  • Kathmandu +05:45, Chatham +12:45
  • Lord Howe — 30-minute DST shift
  • Buffer overflowing a window edge

Self-hosting

Up in one command.

Self-hosting is the product, not an afterthought bolted onto a SaaS. Two services, ten environment variables, migrations that run themselves on boot.

docker-compose.yml
# docker-compose.yml — the entire deployment
services:
  schedra:
    image: ghcr.io/schedra/schedra:latest
    ports: ['3000:3000']
    environment:
      DATABASE_URL: postgres://schedra@db:5432/schedra
      SCHEDRA_URL: https://cal.yourdomain.com
      SMTP_URL: smtp://user:pass@mail.yourdomain.com:587
      AUTH_SECRET: ${AUTH_SECRET}
    depends_on: [db]

  db:
    image: postgres:17-alpine
    volumes: ['schedra-data:/var/lib/postgresql/data']
Boot
$ docker compose up -d
postgres healthy0.9s
schedra migrated1.4s
ready http://localhost:3000

Postgres and nothing else

No Redis, no queue broker, no object store. Jobs and scheduling live in the database you already back up.

Your data stays yours

OAuth tokens encrypted at rest on your disk. No phone-home, no analytics beacon, no vendor in the middle.

Nothing held back

One codebase, every feature. No enterprise tier gating teams, SSO or the API behind a second repository.

Take your
calendar back.

Schedra is early and building in the open. Star the repository, run it locally, and tell us what breaks.