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.
Event types
One-on-one, group, round-robin and collective. Custom durations, locations and questions.
Availability
Weekly hours, date overrides, buffers, minimum notice, booking windows and daily caps.
Calendar sync
Google, Outlook and CalDAV. Two-way, conflict-aware, and reconciled in the background.
Timezones done right
IANA zones, never raw offsets. DST transitions are handled explicitly and tested.
Booking pages
Server-rendered, keyboard-accessible and fast. Brand them, embed them, or both.
Teams
Organizations, roles, shared availability and fair round-robin. Not an enterprise upsell.
API & webhooks
REST with an OpenAPI spec, signed webhooks with retries, and an embeddable widget.
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
Lagos
Africa/Lagos
23:30
Tue 18 Aug
London
Europe/London
23:30
Tue 18 Aug
New York
America/New_York
18:30
Tue 18 Aug
Tokyo
Asia/Tokyo
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 — 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']
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.