Open source · AGPL-3.0
Interview scheduling for hiring teams
Calendo is a multi-tenant scheduling platform for recruiters, interviewers and candidates. Interviewers publish booking pages for their interview types; candidates pick a time without creating an account; Calendo books the interview, creates the Zoom meeting, puts it on the interviewer's Google Calendar, emails everyone, sends reminders, and keeps all of it in sync through reschedules and cancellations.
Scheduling engine
Working hours with split shifts, date overrides, vacation days and company holidays, per-event schedules, buffers, minimum notice, booking windows, daily limits. Time-zone and DST correct (IANA zones via Luxon; instants stored in UTC).
Double-booking prevention
The server recomputes availability at booking time inside a per-interviewer lock, against live Google Calendar free/busy, and a Postgres exclusion constraint rejects overlapping interviews as a last line of defence.
Google Calendar and Zoom
Real OAuth 2.0 (PKCE + state), encrypted tokens with automatic refresh, conflict detection, event and meeting create/update/cancel, push notifications and webhooks, and a retry path for every failure.
Open sign-up and plans
Anyone can create an organization from the marketing site and is signed in immediately, on the Free plan. Premium and Custom are defined in src/lib/plans.ts and recorded on organizations.plan, ready for paid features.
Candidate self-service
Secure, expiring, revocable links to view, reschedule or cancel.
Notifications
Confirmation, reschedule, cancellation and configurable reminder emails with calendar invitations, delivered by a background worker with retries.
Dashboard and admin
Dashboard, list and calendar (month/week/day) views of interviews, filters and search, interview detail with history and sync status, team and user management, organisation settings, email templates, holidays, integrations overview and an audit log.
Free for your whole team
Everything above is included. Premium and Custom plans are for teams that outgrow it.
