All work

Independent concept · not affiliated with Cal.com

TimeBridge

Making cross-timezone scheduling easier to understand.

TimeBridge is an independent concept. It is not affiliated with or connected to Cal.com, and its availability and bookings are simulated in the browser.

TimeBridge booking step: a guest in Tokyo picks a slot, with the host’s time shown beside each one and a line saying Arjun’s time is 3h 30m behind.

The product problem

When a host works 9–5 in India, a guest in Los Angeles is offered times around midnight — and nothing on the page says why.

I checked this on a real booking page using my own Cal.com event (October 2026). The conversion is correct: slots appear in the guest’s zone and the confirmation shows Los Angeles time. What’s missing is context. The flow I tested showed no host-local time and no explanation of the gap.

What this is not

Cal.com’s booking flow isn’t broken or inaccessible; the gap is context, not correctness. And it isn’t yet established that guests are confused by it — no user research has been done.

Design hypothesis

Scheduling interfaces can show mathematically correct times while failing to explain why those times look unusual. If the page says, at the moment it matters, what a time means for the other person, guests can trust an odd-looking slot without extra steps.

The constraint I set: add as little as possible. Context should appear when it explains something and stay out of the way otherwise.

Interaction decisions

  1. 01

    One line of context, computed for the date being viewed.

    “Arjun’s time is 3h 30m behind” sits with the event details. It’s worked out for the selected date, not today, so it changes correctly after a daylight-saving change instead of quietly going stale.

  2. 02

    The host’s time on demand, not by default.

    A switch adds the host’s time beside each slot. Guests who need the comparison get it in one action; everyone else keeps a single, uncluttered list.

  3. 03

    A clock-change note only when one falls in between.

    If a clock change lands between today and the chosen date, one short line says so, with the plain explanation inside a native disclosure — keyboard and screen-reader behaviour come with the element rather than being rebuilt.

  4. 04

    Repeated local times stay distinct.

    On a fall-back day (Los Angeles, 1 November 2026) 1:00–1:59 AM happens twice. Every slot remains a distinct UTC instant, and the repeated times are labelled so two identical-looking buttons never mean the same thing.

  5. 05

    One zone per place in the time-zone picker.

    The picker is a Base UI Combobox over the browser’s own IANA list. Legacy and current ids (Asia/Calcutta and Asia/Kolkata) collapse into a single entry, so people don’t have to guess between duplicates.

The working interface

A guest in Tokyo books a 15-minute introduction with a host in Bengaluru, in three steps: pick a slot, add details, confirm. The confirmation repeats the time in both zones and offers Google Calendar and .ics. Every screenshot below is captured from the running app.

Booking — calendar and time slots in the guest’s time, with the host’s time alongside.
1 · Pick a date and time
Details — name, email and notes, with the slot in both time zones.
2 · Add details
Confirmation — what, when in both time zones, who and where, with calendar options.
3 · Confirmed
TimeBridge booking step in the dark theme.
Confirmation step in the dark theme.
Dark theme · confirmation
TimeBridge on a phone: event details with “Arjun’s time is 3h 30m behind”, the Japan Standard Time zone picker and the October 2026 calendar.
Demo settings on a phone — guest time zone, host’s local time and network simulation.
Demo settings
TimeBridge on a phone in the dark theme.

Architecture and components

React 19 and TypeScript on Vite, with Base UI headless primitives — the time-zone picker, for example, is a Base UI Combobox — styled from a small token file. Time logic lives outside the components, so it’s tested directly without a browser.

Components
MonthCalendar, SlotList, TimeComparison, TimezonePicker, ClockChangeNote, BookingForm, Confirmation, ErrorBoundary
State
useBooker — the booking flow’s state in one hook
Time logic
lib/time and lib/bridge — IANA conversion with Intl, offsets per date, clock-change and repeated-time detection
Data
simulatedBookingService — generates availability in the host’s zone; nothing calls a real backend
Styling
tokens.css design tokens for both themes; contrast pairs are unit-tested

Accessibility

  • Keyboard. A full booking works from the keyboard alone: arrows, Home/End and PageUp/PageDown in the calendar grid, a single tab stop for the time list, and Escape order in nested popups.
  • Focus management. Focus moves deliberately after each step change, after Back, after a booking conflict and after a crash, and returns where it came from.
  • Contrast. Text (1.4.3) and non-text (1.4.11) pairs are tested with the WCAG formula; field edges, the switch and the selected 12h/24h segment are measured in the browser in both themes.
  • Reflow and motion. No horizontal scroll from 1440 px down to 375 px, 24 px minimum targets, and reduced motion respected.

Not yet done

TimeBridge targets WCAG 2.2 AA, but passing automated checks isn’t a conformance claim. It hasn’t been tested with a screen reader yet.

Testing and verification

Unit · Vitest
time conversion, DST in several zones, the Los Angeles fall-back day, locale formatting, date selection, booking, contrast
End-to-end · Playwright
booking flow, layout and reflow, locale + DST, error-boundary recovery — desktop and mobile projects
Accessibility · axe-core
WCAG 2.0–2.2 A/AA rules across the calendar, menus, open selects, form errors, confirmation and the error screen, in light and dark
CI workflow
configured for GitHub Actions: npm audit, typecheck, lint, unit tests and build, then Playwright in Chromium, Firefox and WebKit

Locally the end-to-end suite has been run in Chromium; the configuration also defines Firefox and WebKit.

Known limitations

  • Simulated data. Availability and bookings are generated in the browser; nothing connects to Cal.com.
  • Unvalidated. The hypothesis hasn’t been tested with guests yet, so there are no outcome claims here.
  • Screen readers. Not yet tested with VoiceOver or NVDA.