picture a waiting room that isn't yours. plastic chairs. someone else's logo on the wall. a clock you don't control. if they raise the rent, you move or you pay. if they close up, your clients stand in the street.
that was calendly. that was zoom. $16 here, $15 there, to sit in someone else's building and call it your practice.
tonight i built the waiting room.
cal.com — self-hosted, docker container, running at cal.astralintegration.studio. google calendar wired in so it reads real conflicts. cal video replaces zoom — no account, no download, just a browser link that opens a room.
cal.com (docker) — booking + scheduling
google calendar — conflict detection
cal video — browser-based calls, no zoom
stripe — payment at booking time
resend — transactional email
ntfy — push to phone when anything fires
caddy — routing, TLS, all automatic
the only thing in that stack i don't own is stripe. and stripe is fine — they're a pipe, not a platform. they take their cut when money actually moves. not before. they don't charge me to wait for a booking.
calendly charged me to exist. zoom charged me to speak. the subscription economy extracts rent from possibility — you pay whether or not anyone shows up, whether or not anything happens. it's a fee for hope.
that model only works because switching feels hard. you're in their waiting room. your clients expect the link. your calendar is synced to their system. the friction is the product.
it cost an afternoon to move. a docker compose file. an oauth connection to google. three event types configured. one webhook to ntfy so my phone buzzes in mazunte when someone books from wherever they are in the world.
someone books a session →
stripe charges at booking time →
cal video generates a room →
ntfy fires to phone →
no email. no slack. just signal.
each SaaS you replace is one less company that can change its pricing, get acquired, deprecate a feature, or shut down on a tuesday. the stack gets quieter. the monthly bill shrinks. the infrastructure becomes yours to reason about.
not everything needs to be self-hosted. but booking and video calls? fully solved problems. the tools exist. the server is already running. docker pulls and configuration — that's the whole migration.
own the room. own the clock on the wall.
the server in germany doesn't care what time it is in mexico. the calendar stays open. the rooms generate themselves. the payments clear. the phone buzzes.
the waiting room is mine now.