Highlight text β Google Calendar event in under 5 seconds.
A Chrome extension powered by Gemini AI.
The extension ships with a built-in OAuth client and a shared Gemini API key so you can get started immediately β no Google Cloud setup required.
Note: The built-in OAuth client is limited to 100 authorized users by Google (while the app is unverified). If you hit an authorization error, follow the Self-Hosted Setup section below to configure your own credentials.
git clone https://github.com/arqamwd/schedio.git
cd schedio
pnpm installpnpm packageThis creates build/chrome-mv3-prod.zip.
- Extract the zip:
- Find
build/chrome-mv3-prod.zip - Extract it to a folder (right-click β "Extract All" on Windows, double-click on Mac, or
unzip build/chrome-mv3-prod.zip -d build/chrome-mv3-prodin terminal)
- Find
- Open chrome://extensions
- Enable Developer mode (top-right toggle)
- Click Load unpacked
- Select the extracted folder (
build/chrome-mv3-prod)
- Highlight any text on a webpage that describes an event
- Right-click β "Create Event with Schedio" or press Alt + Shift + S
- A modal appears with the parsed event details β edit if needed
- Click Add to Calendar β done β
Highlight text β Gemini AI extracts event details β You review β One click to Google Calendar
- You highlight text like "Team standup, Friday 3pm, Room 204"
- Gemini AI parses it into structured data (title, date, time, location)
- A modal overlay shows the parsed event for you to review or edit
- One click sends it to Google Calendar via the Calendar API
Schedio handles timezone offsets deterministically in code β Gemini only extracts the raw date/time text, never does timezone math.
| Feature | Description |
|---|---|
| π€ AI Parsing | Gemini 2.5 Flash extracts event details from any highlighted text |
| π Google Calendar | Creates events directly via the Calendar API |
| β¨οΈ Keyboard Shortcut | Alt + Shift + S (customizable in chrome://extensions/shortcuts) |
| π±οΈ Context Menu | Right-click β "Create Event with Schedio" |
| π¨ Inline Modal | Raycast-style overlay to review/edit before saving |
| π Date Picker | Built-in calendar picker for quick date changes |
| π Custom API Key | Bring your own Gemini key for unlimited personal usage |
| π Account Switching | Switch Google accounts from the settings page |
If the built-in OAuth client has hit its 100-user cap, or you want full control, follow these steps to configure your own Google Cloud credentials.
- Go to Google AI Studio
- Sign in with your Google account
- Click Create API Key
- Copy the key
- Go to the Google Cloud Console
- Create a new project (or select an existing one)
- Enable the Google Calendar API:
- Go to APIs & Services β Library
- Search for Google Calendar API
- Click Enable
- Configure the OAuth consent screen:
- Go to APIs & Services β OAuth consent screen
- Choose External user type
- Fill in the app name (e.g. "Schedio") and your email
- Add the scope:
https://www.googleapis.com/auth/calendar.events - Add your email as a test user
- Save
- Create OAuth credentials:
- Go to APIs & Services β Credentials
- Click Create Credentials β OAuth client ID
- Application type: Chrome Extension
- Name:
Schedio - Item ID: Your extension's ID (find it at
chrome://extensionswith Developer mode on) - Click Create
- Copy the Client ID (looks like
xxxx.apps.googleusercontent.com)
-
Create your
.env.localin the project root:PLASMO_PUBLIC_GEMINI_API_KEY=your_gemini_api_key_here
-
Update the OAuth client ID in
package.jsonundermanifest.oauth2:"oauth2": { "client_id": "YOUR_CLIENT_ID_HERE.apps.googleusercontent.com", "scopes": [ "https://www.googleapis.com/auth/calendar.events" ] }
-
Update the extension key in
package.jsonundermanifest.key:- This ensures a consistent extension ID across installs
- You can generate one or remove the
keyfield entirely for local development (Chrome will assign a random ID β just make sure it matches your OAuth client's Item ID)
-
Build and load:
pnpm package
Extract
build/chrome-mv3-prod.zip, then load the extracted folder as an unpacked extension (see Quick Start step 3).
Even after setting the .env.local key (which acts as the shared default), you can override it per-install:
- Right-click the Schedio extension icon β Options
- Paste your Gemini API key
- Click Save
This key is stored locally in chrome.storage.local and is never sent anywhere except Google's Gemini API.
schedio/
βββ src/
β βββ background/index.ts # Service worker: context menu, API calls, auth
β βββ content.tsx # Content script: overlay modal injection
β βββ popup.tsx # Extension popup UI
β βββ options.tsx # Settings page (API key, account, shortcuts)
β βββ components/
β β βββ event-modal.tsx # Raycast-style event review modal
β β βββ calendar-picker.tsx
β β βββ ui/ # Shadcn-based UI primitives
β βββ lib/
β β βββ gemini.ts # Gemini AI parsing + timezone handling
β β βββ utils.ts
β βββ types/
β β βββ events.ts # CalendarEvent type
β β βββ messages.ts # Message types for background β content
β βββ style.css # Tailwind + custom styles
βββ assets/ # Extension icons
βββ package.json # Plasmo config + manifest overrides
βββ tailwind.config.js
βββ tsconfig.json
βββ postcss.config.js
# Install dependencies
pnpm install
# Start dev server (hot reload)
pnpm dev
# Production build
pnpm build
# Package for distribution (.zip)
pnpm packageLoad the dev build from .plasmo/chrome-mv3-dev during development.
- All external API calls (Gemini, Google Calendar) happen in the background service worker, not the content script. This avoids Content Security Policy (CSP) violations in Manifest V3.
- Shadow DOM: The overlay modal is injected via Plasmo's content script system with Shadow DOM isolation, so page styles don't leak in and extension styles don't leak out.
- Timezone handling: Gemini returns naive datetimes (no timezone). The extension computes the correct UTC offset for the event's specific date (DST-aware) and appends it deterministically in code β the LLM never does timezone math.
MIT Β© Arqam Waheed