calnode README

The project's README from github.com/Calnode/calnode. As one markdown file: README.md.

Calnode

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

OpenSSF Scorecard · Audit it yourself


Quick start

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 below, or the full DEPLOY.md.


Why Calnode


Calnode vs cal.com

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.


AI-native

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":"[email protected]","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:

User:  "Book a 30-min call with Wynne next week — I'm in Auckland."
Agent: get_available_slots("intro-call", "2026-06-16", "2026-06-20", "Pacific/Auckland")
       → presents options → create_booking(…) → returns confirmation + meeting link

Conversational booking — in the booking page itself. Beyond agents, the booking page (and the embed widget) ships an optional "Book by chat" assistant: a visitor types "free Tuesday afternoon or next week" and it resolves real availability and books — the deterministic engine still computes the slots (the model never invents times), and the assistant only ever sees free/busy windows, never your calendar contents. Bring your own model — any OpenAI-compatible endpoint (a hosted model or one you run yourself); off by default, with the standard calendar always there as the fallback.

Connecting Claude (remote / HTTP). In Claude (claude.ai or Desktop) → Settings → Connectors → Add custom connector → enter https://<your-instance>/mcp → Connect → sign in → Allow. Custom connectors need a paid Claude plan; the server must be on HTTPS. Local stdio alternative (any plan): point an MCP client at the calnode mcp subcommand via its config file — no OAuth, runs against the local DB.

Permissions. MCP tools are role-scoped, mirroring the rest of the app: an owner/admin acts across the whole workspace, a member sees and manages only bookings they host. (The stdio subcommand is the local operator → full access.) Booking creation and availability are the public booking surface, open to all. Roles are fixed (owner / admin / member); configurable RBAC is intentionally out of the lean core.


Deploy for real

docker run -d -p 3000:3000 \
  -e BASE_URL=https://booking.example.com \
  -e CALNODE_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
  -e CALNODE_RECOVERY_SECRET="$(openssl rand -hex 32)" \
  -e DATABASE_URL=sqlite:///data/calnode.db \
  -v calnode-data:/data \
  ghcr.io/calnode/calnode:latest

Pinning a version. :latest follows the newest tagged release; :edge tracks main. For reproducible deploys, pin a release — :0.1 (tracks patches within the minor) or an exact :0.1.0. See releases.

Open / → it redirects to /admin/ and walks you through first-run setup (create the owner account, connect a calendar, add an event type). Put a TLS-terminating proxy in front that forwards the original Host header.

Full guide → DEPLOY.md (env vars, Railway step-by-step, custom domains, Resend email, Google & Microsoft OAuth, Litestream backups, troubleshooting).


Features

Shipped

On the roadmap


Stack


Design principles

A few load-bearing decisions (full detail in the the design docs):


Audit it yourself in 10 minutes

Calnode's backend is small enough to fit entirely in one LLM's context window — most scheduling software (cal.com included) can't say that. AUDIT.md turns that into a self-serve check: a copy-paste scanner block (govulncheck, gosec, gitleaks across full history, SBOM, semgrep — all neutral, standard tooling you run yourself), an adversarial LLM prompt-pack for your own coding agent, and a claims → verification manifest mapping every security claim we make to exactly how to check it in the source. Not a certification — a due-diligence accelerator.


Commercial support

Self-hosting is free forever — docker run it and you own the whole thing. If you'd rather not run it yourself, Orchestratr — the team behind Calnode — will deploy and operate it for you:

Built for regulated and mid-to-large orgs that need Calnode on their own infrastructure, fully integrated. → calnode.com/services


License

Apache-2.0. The full scheduler is self-hostable, and nothing previously free is ever paywalled.

The code is Apache-2.0; the "Calnode" name and logo are not — see TRADEMARK.md (use the code freely; name your fork something else). Contributions are accepted under a CLA so the project can stand behind every line and keep its future licensing options open — see CONTRIBUTING.md.

calnode (Calnode/calnode)

Searching Database…

这是什么?Calnode 是一个像 Calendly 或 Cal.com 那样的可自托管日程预约应用,以单个 Go 二进制发布,内嵌 SQLite 数据库。它自带官方视频会议、录制和 AI 会议纪要,采用 API 优先的构建方式,并为 AI 智能体提供原生 MCP 服务器。
这是完整应用,还是我要嵌入的库?它是一个完整自包含的应用:单个静态 Go 二进制同时提供管理界面、公开预约页面和 REST/MCP API,不需要任何外部数据库或服务。
怎么让它跑起来?先用一条 docker 命令跑起来看看(数据存放在 ./data),或者按照 DEPLOY.md 部署带 HTTPS、持久加密密钥和备份的生产环境。
运行它需要 Postgres 或 Redis 吗?不需要——Calnode 刻意避开这些。唯一可选的外部依赖是 LiveKit 服务器,前提是你启用内置视频会议。
默认设置有什么坑或缺什么功能吗?不设置加密密钥时,它会使用一个临时密钥,存储的凭据在重启后就会失效。另外,RBAC 固定为 owner/admin/member 三种角色(不支持自定义权限),非英文翻译是机器起草、未经母语审校的。
相比 cal.com,它适合谁?它面向想要小巧、快速、可脚本化、对 AI 就绪的自托管日程工具的人,而不是 cal.com 那种把功能堆到极致的 SaaS 风格单体应用。
能在小型 VPS 上低成本运行吗?可以——它的设计目标就是跑在 5 美元的 VPS 上,因为它只是一个对外提供 SQLite 文件服务的静态二进制。
AI 助手会看到我真实的日历数据吗?不会——对话式的 「Book by chat」 助手只能看到忙/闲时间窗,绝不会看到日历内容,而且实际可用时段由确定性引擎(而不是模型)来计算。
README 未说明Calnode 采用 Apache-2.0 许可,自托管没有任何付费墙,不像 cal.com 的 AGPL-3.0。
MCP 服务器实际能让智能体做什么?内置 MCP 服务器通过 stdio 或 Streamable HTTP 暴露 listeventtypes、getavailableslots、createbooking、getbooking、reschedulebooking、cancelbooking、listbookings 等工具,外加会议纪要/转录工具,底层使用与 REST API 相同的内部服务。
Calnode 如何处理时区和夏令时?它把时间存储为 UTC 时刻加 IANA 时区名称,而不是固定偏移量,因此在夏令时切换时可用时段始终能正确解析,不会出现时段错乱。
它支持为预约收款吗?支持——通过 Stripe Checkout 采用先付款后预约的流程:时段先被锁定,支付 webhook 确认后生效,预约取消时自动退款。
怎么把 Claude 或 ChatGPT 连到我的 Calnode 实例?对于 Claude,通过 Settings → Connectors,用你的 HTTPS URL 和 OAuth 登录把它添加为自定义连接器(需要付费 Claude 套餐);对于不支持 OAuth 的本地智能体,可以针对本地数据库通过 stdio 运行 calnode mcp 子命令。
Creator
Calnode
Size
2.8 MB
Stars
118
Age
3mo
Commits · 90 Days