Tandem

Open scheduling you run yourself · v1.0

Your agent finds the time.
You both approve.

Tandem is a self-hosted Calendly alternative. When two people both run Tandem, their agents trade candidate times under limits each owner wrote down. Neither agent can send an invitation. That takes both humans clicking approve.

Watch two agents negotiate

Everything below runs in your browser with made-up calendars. Change either mandate and run it again. The rules mirror the server: every candidate time passes one validator, and every rejection gives a reason.

A
Alice Rivera
Los Angeles · alice@acme.example
Alice's mandate
B
Bob Chen
New York · bob@globex.example
Bob's mandate

The week, in your time zone

Working hoursBusy OfferedAgreed

What the agents said

  1. Press Start negotiation.

What ships in 1.0

Mandates with hard limits

Allowed counterparties, days, hours, lengths, buffers, a daily cap, notice, look-ahead, round limit and how many times one message may reveal. Each version is hashed. No setting lets an agent skip approval.

Signed agent protocol

Ed25519 signatures with pinned peer keys, sequence numbers, nonces and timestamps. Export any negotiation as a signed log and check it offline with tandem verify-export.

Booking links for everyone else

Personal and team links with intake questions, your photo, bio and color, a guest time-zone picker and a 12/24-hour clock. Guests reschedule or cancel from a signed link.

Teams

Round robin gives each booking to the free member booked least recently. Collective links only offer times when everyone is free and invite all of them.

Email that calendars understand

Confirmations, reminders, reschedules and cancellations in each reader's time zone, with .ics invites that update the same event. Sending retries in the background.

Embeds and webhooks

One script tag puts a booking page on any site, inline or as a popup. HMAC-signed webhooks for created, moved, cancelled and agent-confirmed meetings, with retries and a delivery log.

Google and Outlook

Busy time from Google Calendar or Microsoft 365, including extra calendars you pick. Events are created on your calendar and the provider sends the invitations.

Accounts you control

Password sign-in with scrypt, invite-only sign-up by default, CSRF-checked sessions, API keys for scripts, rate limits, strict security headers and JSON logs.

Optional Claude drafting

Describe your rules in plain English and Claude drafts a mandate. You review the diff before anything changes. Without an API key the feature stays off.

Run it yourself

One container and one SQLite file. Free to run on any small VM or home server.

docker run -d --name tandem --restart unless-stopped -p 8700:8700 \
  -v tandem-data:/data \
  -e TANDEM_BASE_URL=https://cal.example.com \
  -e TANDEM_INSTANCE_ID=cal.example.com \
  ghcr.io/eshaanjain26/tandem:1.0.0
  1. Put it behind a TLS proxy. With Caddy that's two lines: cal.example.com { reverse_proxy 127.0.0.1:8700 }.
  2. Open /dashboard. The first account becomes the admin; invite the rest of your team from Account.
  3. Set TANDEM_CALENDAR=google or microsoft and the OAuth client values, plus SMTP_* for email.
  4. Back up with docker exec tandem tandem backup /data/backup.db. Upgrades migrate the database on start.

Images are built for amd64 and arm64, so a Raspberry Pi works too.