Vibecode zcal

track this build4 phases, 12 steps, beginner friendly
YES · one-shottable
price variesbuild time one sittingcategory 📅 schedulingreplaced by 0 people

zcal's solo core is compact: build a personal freeform scheduling tool that reads one calendar, publishes availability, reserves a slot, and writes the event back. A competent builder can reach a useful personal version in one sitting, while the paid product mainly wins on OAuth, calendar reliability.

the project pack5 files · written for this build, step by step
README.md
# zcal · indie build

A personal booking page whose hard problems are computing availability without copying your calendar's contents, rendering slots correctly across two timezones and a clock change, and turning a click into exactly one event even when the calendar call times out.

Estimated effort: **weekend**. Work `BUILD_PLAN.md` top to bottom · every phase ends in a check that has to pass before the next one starts.

## Stack

| Part | Choice | Why |
| --- | --- | --- |
| Runtime | TypeScript on Node 22, one process, SQLite | a booking page is small and all of its difficulty is in the details |
| Calendar read | Google Calendar freeBusy only, never events.list | freeBusy returns busy ranges without titles, so private events stay private |
| Time | Instants stored in UTC, zones resolved from the IANA database at display | almost every scheduling bug is a timezone bug |
| Booking | A local reservation row with a unique constraint, taken before the calendar is touched | two people clicking the same slot is the race that matters |
| Calendar write | events.insert with a client-supplied base32hex id derived from the reservation | a retry after a timeout writes the same event rather than a second one |
| Mail | One provider behind one send function, with a calendar invitation attached | the confirmation is as much the product as the page is |

## Before you start

Have every one of these ready. The plan assumes them from step one.

- [ ] **Node.js 22 or newer** · free
  - Why: Runs the booking page and the calendar client in one process.
  - Get it: nodejs.org, or nvm install 22.
  - Verify: node --version prints v22 or higher
- [ ] **A Google Cloud OAuth client for the Calendar API** · free
  - Why: Reading freeBusy and writing events both need an OAuth client, and the consent screen configuration decides how often your refresh token survives.
  - Get it: Create a project, enable the Calendar API, create an OAuth client of type web application and add your callback URL.
  - Verify: A consent round trip returns a refresh token and a freeBusy query succeeds
- [ ] **A throwaway calendar with real-looking events** · free
  - Why: The privacy test and the drift test are only meaningful against a calendar containing events whose titles you would mind leaking.
  - Get it: Create a second calendar on the same account and add a few private events across a clock change weekend.
  - Verify: freeBusy returns busy ranges for it and no titles
- [ ] **A host with a stable HTTPS URL** · a few pounds a month
  - Why: The OAuth callback and the public booking page both need an address that does not change, and the callback must match the client exactly.
  - Get it: A small VPS with a domain, or a tunnel with a fixed hostname for development.
  - Verify: The callback URL registered in the client resolves and completes consent
- [ ] **An email provider for confirmations** · free tier is enough for personal use
  - Why: A booking nobody was told about is not a booking, and the invitation attachment is what puts it in the invitee's calendar.
  - Get it: Any transactional provider or an SMTP account you already own.
  - Verify: A confirmation arrives with a valid calendar invitation attached
- [ ] **Working hours, buffers, notice and the clock change rule** · free
  - Why: Each one is asserted by a test, and deciding them after seeing which slots appear means choosing whatever the code already did.
  - Get it: Write down your hours per weekday in your zone, the buffers, the minimum notice, the horizon, and what happens to a slot in the missing hour.
  - Verify: All five appear in configuration and are named in the tests

## Quick start

Follow Phase 1 in `BUILD_PLAN.md`; it creates the project.

Then copy `.env.example` to `.env` and fill in the values it documents.

## Honest limits

This build deliberately does not replace:

- Teams, routing and round robin.
- Payments at booking.
- A second calendar provider.
- Hosted booking pages for other people.
- multi-calendar conflict handling
- race-free booking under load
- team routing and round robin
- reliable reminders and timezone edge cases
- calendar-provider edge cases and timezone correctness

If one of those is essential to you, that is the reason to keep paying for zcal, and the README should say so rather than pretend.

$ choose a build depth, inspect the files, then open the complete pack in your agent

why people still pay

zcal: People pay because a booking tool must never double-book them, leak private events, or send the wrong time to a client.

what you lose

xmulti-calendar conflict handling

xrace-free booking under load

xteam routing and round robin

xreliable reminders and timezone edge cases

xcalendar-provider edge cases and timezone correctness

share on X ↗"I just replaced zcal with one prompt"
the escape hatch

Don't feel like building it? These folks already made it free.

Calendly FreeOne active event type and unlimited bookings; meeting polls survive, workflows and teams do not.$0free↗TidyCal FreeUnlimited one-person booking types and paid bookings on one calendar; group meetings and fancy emails cost extra.$0free↗YouCanBookMe FreeOne booking page, but it keeps forms, payments, confirmations, polls and the calendar-overlay trick.$0free↗

all 3 free alternatives to zcal →· no votes, no pay-to-list · just what's real

the numbers

zcal pricing

planmonthlyannual (per mo)what you get
free forever$0/user$0/userUnlimited scheduling links, meeting polls, and calendar connections.
pro$7/user—750 SMS credits/month; advanced scheduling and branding controls.
business$12/user—1,500 SMS credits/month; team administration and business controls.

free tierUnlimited scheduling links, meeting polls, and calendar connections.

billingmonthly only; no annual price is published

hidden costsSeats added mid-cycle are prorated; SMS usage beyond included credits may require more credits, but the public overage price was not verified.

verified 2026-08-14 · source ↗

questions
Vibecode zcal

Yes. A competent AI coding agent (Claude Code, Codex, Cursor) can build a usable personal zcal replacement in one session with the prompt on this page. It runs on your own machine or server with no subscription.

How much does zcal cost?

zcal's pricing is usage-based or varies by plan · The official pricing URL is recorded, but a stable current amount was not safely recoverable in this pass. Do not publish a number until rechecked..

What do I lose by replacing zcal?

Honestly: multi-calendar conflict handling; race-free booking under load; team routing and round robin; reliable reminders and timezone edge cases; calendar-provider edge cases and timezone correctness. If any of those are load-bearing for you, keep paying.

Is there an open-source alternative to zcal?

Yes: Calendly Free (One active event type and unlimited bookings; meeting polls survive, workflows and teams do not.) TidyCal Free (Unlimited one-person booking types and paid bookings on one calendar; group meetings and fancy emails cost extra.) YouCanBookMe Free (One booking page, but it keeps forms, payments, confirmations, polls and the calendar-overlay trick.) All 3 curated free alternatives are at vibecodeit.com/zcal/alternatives. The prompt is for when you want it exactly your way.