Your scheduling companion — in your pocket or your browser.
Website · App Store · Google Play · Chrome Web Store
Cal.com Companion lets you manage your Cal.com schedule from anywhere. It ships as a mobile app (iOS & Android), a set of browser extensions (Chrome, Firefox, Safari, Edge), and home-screen widgets — all from a single codebase.
A native companion app built with Expo and React Native.
- Bookings — View, cancel, reschedule, add guests, and mark no-shows
- Event Types — Browse and edit event types including duration, recurrence, limits, and availability
- Availability — Manage schedules, working hours, and date overrides
- Widgets — Home-screen widgets for iOS (WidgetKit) and Android show your upcoming bookings at a glance
- Dark mode — Full light/dark theme support that follows your system preference
- OAuth — Secure sign-in via Cal.com OAuth with PKCE
A cross-browser extension built with WXT that brings Cal.com into the pages you already use.
- Sidebar — Click the Cal.com icon in your browser toolbar to open a sidebar with your full bookings, event types, and availability
- Gmail integration — A Cal.com button appears in the Gmail compose toolbar so you can insert a scheduling link directly into an email
- LinkedIn integration — A Cal.com button is injected into the LinkedIn messaging composer for quick link sharing
- Google Calendar no-show — Adds a "No Show" toggle next to attendees in Google Calendar event popups for Cal.com bookings
- Supported browsers — Chrome, Brave, Firefox, Safari, and Microsoft Edge
| Layer | Technology |
|---|---|
| Mobile app | Expo (React Native) with Expo Router |
| Styling | NativeWind (Tailwind CSS for React Native) |
| Browser extension | WXT (next-gen web extension framework) |
| Data fetching | TanStack Query with persistent cache |
| iOS widget | SwiftUI + WidgetKit |
| Android widget | react-native-android-widget |
| Auth | Cal.com OAuth 2.0 with PKCE |
- Node.js (v18+)
- Bun (recommended) or npm
- For mobile development: Xcode (iOS) or Android Studio (Android)
bun installCopy the example env file and fill in your Cal.com OAuth credentials:
cp .env.example .env# iOS
bun run ios
# Android
bun run android
# Web (Expo)
bun run web# Dev mode (Chrome, hot reload)
bun run ext
# Build for a specific browser
bun run ext:build-chrome
bun run ext:build-firefox
bun run ext:build-safari
bun run ext:build-edge
# Build all browsers
bun run ext:build-allProduction builds (for store submission) use the -prod variants which point to https://companion.cal.com:
bun run ext:build-chrome-prod
bun run ext:zip-chrome-prod├── app/ # Expo Router screens (tabs, modals, sheets)
├── components/ # Shared React Native components
├── extension/ # Browser extension source (WXT)
│ ├── entrypoints/ # Background script & content script
│ ├── lib/ # Gmail, LinkedIn, Google Calendar integrations
│ └── public/ # Extension icons & static assets
├── hooks/ # Custom React hooks
├── services/ # Cal.com API client & OAuth service
├── contexts/ # React context providers (Auth, Query, Toast)
├── widgets/ # Android home-screen widget
├── targets/widget/ # iOS WidgetKit target (SwiftUI)
├── utils/ # Shared utilities
├── config/ # Cache configuration
├── constants/ # Colors, timezones
└── types/ # Shared TypeScript types
| Command | Description |
|---|---|
bun run start |
Start the Expo dev server |
bun run ios |
Run on iOS simulator |
bun run android |
Run on Android emulator |
bun run web |
Run in the browser via Expo |
bun run ext |
Start extension dev server (WXT) |
bun run ext:build-all |
Build extension for all browsers |
bun run typecheck |
Type-check the mobile app |
bun run typecheck:extension |
Type-check the browser extension |
bun run lint |
Lint with Biome |
bun run format |
Format with Biome |
bun run check:ci |
Run Biome CI checks |
This repo uses Biome for linting and formatting, enforced via Husky pre-commit hooks. Before submitting a PR, make sure your changes pass:
bun run check:ci
bun run typecheck:all