Calnode vs. calrs vs. Tymeslot: three self-hosted answers to Calendly Calnode launched as an Apache-2.0 self-hosted Calendly alternative distributed as a single Go 1.26 static binary with an embedded SQLite database, requiring no Redis, Postgres, or separate API server. Calnode ships a REST API with 88 endpoints, HMAC-signed webhooks configurable via API, a native MCP server built on the official Go SDK with stdio and Streamable HTTP transports, and optional first-party LiveKit video rooms with recording and an AI notetaker exposed as MCP tools and webhooks. The project positions itself against cal.com, which it says spans 500k+ lines of TypeScript across roughly 100 packages and needs a 4 GB+ image with Redis, Postgres, and an API server, while Calnode runs from a single docker run command on a $5 VPS. A lean, self-hostable scheduling engine that lives in your AI stack. Calnode is a Calendly-style booking app — with first-party video meetings, recording, and AI notetaking built in — shipped as a single Go binary with an embedded SQLite database: no Redis, no Postgres, no separate API server, no multi-gigabyte image. It's API-first, webhook-native, and built for a world where agents do the booking. Self-host the whole thing on a $5 box; nothing is paywalled. Calnode runs for pennies on a small VPS — it's a single static binary serving a SQLite file, so there's almost nothing to pay for. Apache-2.0 · Go 1.26 · single static binary · SQLite + Litestream Kick the tires — one command, no config: docker run -p 3000:3000 -v ./data:/data ghcr.io/calnode/calnode:latest → open http://localhost:3000 The whole app — booking pages, admin UI, SQLite — in one container, with data in ./data . With no encryption key set it runs on an ephemeral one fine for a look; stored credentials won't survive a restart . Deploying for real — HTTPS, a persistent encryption key, backups — see Deploy for real deploy-for-real below, or the full DEPLOY.md https://github.com/Calnode/calnode/blob/main/DEPLOY.md . - One binary, one file. Pure-Go SQLite no CGO compiles to a fully static binary. docker run it, or drop it on a VPS. No external services to orchestrate built-in video, if you turn it on, is the one add-on — it needs a LiveKit server . - Meetings built in. Optional first-party video rooms LiveKit as a booking location — guests join in-browser, no app or account. Recording lands in your own Litestream backup bucket no extra storage to provision ; an AI notetaker turns each call into a transcript + notes, exposed as MCP tools and webhooks. The one add-on: video needs a LiveKit endpoint Cloud or self-hosted . - API-first, agent-ready. A full REST API 88 endpoints with API keys and HMAC-signed webhooks configured via API — script every booking action from Claude, ChatGPT, n8n, or curl. Plus a native MCP server built into the binary official Go SDK; stdio + Streamable HTTP so agents get first-class booking tools. - Modern, no bloat. Go backend + a SvelteKit 5 admin app; public booking pages are server-rendered Go templates for instant first paint and a tiny payload. - Correct by construction. DST-safe time handling UTC instant + IANA name , a transactional double-booking guard, and native-API calendar free/busy never stale .ics feeds . - Yours. Instance-per-tenant by design — one deployment is one isolated workspace, your data, your calendar credentials. No shared multi-tenant database. - Easy to extend. A clean Go codebase with sqlc -generated queries — not a 100-package monorepo. Add an endpoint without spelunking. The default open-source scheduler is a SaaS monolith. Calnode is the opposite. | | cal.com | Calnode | |---|---|---| | Codebase | 500k+ LOC TS across ~100 packages | Lean Go + one SvelteKit app | | Runtime deps | 4 GB+ image; needs Redis + Postgres + API server | One static binary + a SQLite file | | Database | Postgres + Redis | SQLite WAL + Litestream point-in-time backup | | Webhooks | UI-only | API-first , HMAC-signed, per-webhook payloads | | AI / agents | None | REST API + webhooks + a native MCP server stdio + HTTP | | Video & recording | Third-party links Zoom / Meet | Built-in in-browser rooms + recording + AI notes self-hosted LiveKit | | Deploy | Orchestrate several services | docker run one container | | Isolation | Shared multi-tenant DB org id everywhere | Instance-per-tenant — isolation is the default | | Licence | AGPL-3.0 | Apache-2.0 , nothing paywalled for self-host | cal.com figures reflect its public footprint; see the the design docs for the full rationale. If you're weighing self-hosted schedulers and you want small, fast, scriptable, and AI-ready over feature-maximal, Calnode is built for you. Everything a human can do, an agent can do — over the API today: Find slots and book, with an API key curl -s "$BASE/v1/event-types/intro-call/slots?from=2026-06-16&to=2026-06-20&tz=Pacific/Auckland" \ -H "Authorization: Bearer $API KEY" curl -s -X POST "$BASE/v1/bookings" -H "Authorization: Bearer $API KEY" \ -H 'Idempotency-Key: 9f3c…' -H 'Content-Type: application/json' \ -d '{"event type slug":"intro-call","start at":"2026-06-17T21:00:00Z","name":"Alex","email":"alex@example.com","timezone":"Pacific/Auckland"}' Wire booking lifecycle events booking.created / .rescheduled / .cancelled to n8n / Make / your own service with HMAC-signed webhooks — all configured through the API, not buried in a UI. Native MCP server. A Model Context Protocol server is compiled into the binary official Go SDK , exposing eight first-class tools — list event types , get event type , get available slots , create booking , get booking , reschedule booking , cancel booking , list bookings . The MCP tools call the same internal services as the REST API no parallel code path , so booking side effects — calendar events, confirmation emails, webhooks, reminders — fire identically. Two transports: - stdio for local agents — run calnode mcp logs to stderr, JSON-RPC on stdout . - Streamable HTTP at POST /mcp for remote agents. Calnode is its own OAuth 2.1 authorization server dynamic client registration + PKCE , so an agent adds the server by URL and clicks Connect → signs in with the workspace's Google/Microsoft login → approves a consent screen — no pre-shared key. A cno API key also works Authorization: Bearer