Scheduling is one of the worst things in the world. I hate it, you hate it, we all hate it. Finding a time to meet with somebody is so exhausting! It’s why all these apps like Calendly, When2Meet, and cal.com exist. Of course, every one of these stores your appointments and information in their database, and so when you switch, you have to do a whole dance. 💃🏽

So I built Tandem.

Tandem is an appointment scheduler, built on the AT Protocol1. Anybody can book time with you, and the booking gets written into your private space on your PDS2. Here’s what’s different about it, and then some detail for the nerds.

First, a disclaimer and a boundary: I’m not a classically trained software developer. I use LLMs heavily in my work, including in the design, at last for initial alpha launches like this. Unless you’re going to pay for me to get the education in the way my brain needs and subsidize the time I take to get it, or pay for a designer/developer, please don’t bother me about this. I don’t care about your opinions on my usage of AI. Just don't use the tool.

Okay, here we go. Here’s the deal:

Your data is yours - like always!

Arguably, the tandem lexicon3 is more important than the UI. Your hours, your calendar connections, every booking anybody ever makes with you, all of it lives in your own repo, not on some server that I own. Use the lexicon, suggest changes, build your own stuff on top. The information about you is yours!!!

You can find the repo here: https://tangled.org/chaosgreml.in/tandem

Feel free to open issues, and shortly we'll have a board up at !

You can

It looks like a dance card

Open times are numbered lines on a program. Taken ones stay on the card marked “engaged,” in pencil. When somebody books, they get a wax seal with their initial. I have a BFA in musical theatre and I wasn’t going to waste it on a dropdown, mmk, babes?

It’s built on permissioned data.

Guests don’t need an account and never see your calendar, only your open times. Before they confirm, they see exactly what’s about to be written into your book, so there’s nothing hidden on either side. Your calendar passwords never get copied to my database. Tandem can only touch its own corner of your account, and one button disconnects it and closes your card.

It’s an alpha, running on an alpha

You have to have a permissioned spaces-capable PDS, or sign up on the Bluesky hosted one. The spec may change, and if it does, Tandem will change with it. I’m still rapidly building, including OAuth support for Google and Microsoft, email notifications, and more. So get your feedback in and let me know what you think!

For the nerds

On protocol, all the way down

Sign in with OAuth from any spaces-capable PDS and Tandem creates a private space for you. Rules, calendar connections, and bookings are records in that space under published lexicons.

Isolation is structural

Your token is scoped to your own space and cannot name another host’s. OAuth session rows are encrypted with a per-host key, so one host’s ciphertext is useless for another, and web session cookies are stored only as hashes.

The server keeps almost nothing

A booking ledger that acts as the slot lock, purged thirty days after the event. Cached busy intervals with no event details. The host row. Calendar URLs and passwords are never written to the server’s database.

Calendars

CalDAV for iCloud, Fastmail, or any server, plus secret iCal links for Google, Outlook, and Proton. No limit on how many. Pick one CalDAV calendar to receive bookings and each becomes a real event; strike it and the event goes away.

Honest alpha notes

  • The spaces PDS has no backups or security review yet.

  • Guest emails are collected but nobody gets notified.

  • Next up: Google and Microsoft OAuth with write-back, then notification email.

In a nutshell

Meetings suck, scheduing sucks more, but we can make it suck less AND give ourselves power over our technological destiny. I hope you enjoy usind Tandem!!