Chrome extension that creates Google Calendar events from plain text. Type something like "Lunch with Sarah tomorrow at noon at Blue Bottle Coffee" and it just works.
Calendur also includes an iPhone-first PWA served by the same Vercel project. The PWA uses the deployed same-origin /api/* routes automatically and does not have a Backend URL setting.
Uses Claude AI (via a Vercel backend) to parse natural language into structured event data.
- Click the extension icon, type an event description
- Claude parses it into title, date, time, location, recurrence, etc.
- Review/edit the parsed fields
- One click to create the event in Google Calendar
Supports recurring events ("weekly standup every Monday at 10am") and timezones ("call at 3pm EST").
├── api/
│ ├── parse.js # Vercel serverless function (calls Claude)
│ ├── auth/
│ │ ├── token.js # OAuth code → token exchange
│ │ └── refresh.js # Silent token refresh
│ └── web/
│ ├── auth/ # PWA OAuth/session routes
│ └── calendar/ # PWA calendar proxy routes
├── extension/
│ ├── manifest.json # Chrome Manifest V3
│ ├── popup.html/css/js # Main popup UI
│ ├── options.html/css/js# Settings page
│ ├── background.js # Service worker (OAuth + token management)
│ └── icons/ # Extension icons
├── src/ # iPhone-first PWA
├── public/ # PWA manifest and icons
├── package.json
└── vercel.json
- Create a project at console.cloud.google.com
- Enable the Google Calendar API
- Go to Credentials → Create OAuth 2.0 Client ID (type: Web application)
- Copy the client ID
- For the PWA, add
https://<your-vercel-domain>/api/web/auth/callbackas an Authorized redirect URI before testing deployed Google connect
- Open
extension/manifest.jsonand replaceYOUR_CLIENT_ID.apps.googleusercontent.comwith your client ID - Go to
chrome://extensions(orbrave://extensions) - Enable Developer mode
- Click Load unpacked → select the
extension/folder - Copy the extension ID from the extensions page
- Back in Google Cloud Console, add
https://<extension-id>.chromiumapp.org/as an Authorized redirect URI on your OAuth client - Add your Google account email as a Test user in the OAuth consent screen
npm install
npm run buildDeploy the same root project to Vercel:
vercel --prodVercel serves the PWA from the root static build and keeps serverless APIs under /api/*. Do not add rewrites that shadow /api/*.
Set the environment variables in Vercel dashboard:
ANTHROPIC_API_KEY— your Anthropic API keyGOOGLE_CLIENT_ID— your Google OAuth client ID (same as in manifest.json)GOOGLE_CLIENT_SECRET— your Google OAuth client secret (from Google Cloud Console → Credentials → your OAuth client)SESSION_SECRET— random session encryption secret, minimum 32 characters
- Click the extension icon → Settings (gear icon)
- Set Backend URL to your Vercel deployment URL (e.g.,
https://calendur.vercel.app) - Connect your Google account
- Set default calendar, event duration, and reminders
- Open
https://<your-vercel-domain>/in iPhone Safari - Share → Add to Home Screen
- Launch Calendur from the Home Screen icon
- Tap Connect and complete Google OAuth
- Set default calendar, event duration, and reminders
The PWA has no Backend URL setting. It calls the deployed same-origin Vercel APIs automatically, including /api/parse, /api/web/auth/*, and /api/web/calendar/*.
The first PWA iteration is online-only. It does not include offline drafts, offline sync, push notifications, native app store packaging, or background calendar sync.
| Setting | Description |
|---|---|
| Backend URL | Extension-only Vercel deployment URL |
| Default Calendar | Which Google Calendar to add events to |
| Default Duration | Fallback when no end time is mentioned (15m/30m/1h/2h) |
| Default Reminders | Up to 5 reminders applied to every event |
- Extension: Vanilla HTML/CSS/JS, Chrome Manifest V3
- PWA: Vite, React, TypeScript
- Backend: Vercel serverless function, Anthropic SDK
- AI: Claude Haiku for text parsing
- Auth: Google OAuth 2.0; the PWA stores Google session material in an encrypted HttpOnly cookie