Skip to content
ArqamWaheedPublic

About

Highlight text on any page, get a Google Calendar event in under 5 seconds. Chrome extension built with Plasmo and Gemini. GitHub Copilot CLI Challenge runner-up.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

Schedio

Schedio

Highlight text β†’ Google Calendar event in under 5 seconds.
A Chrome extension powered by Gemini AI.

Chrome Extension Built with Plasmo MIT License


⚑ Quick Start (First 100 Users)

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.

1. Clone & Install

git clone https://github.com/arqamwd/schedio.git
cd schedio
pnpm install

2. Package the Extension

pnpm package

This creates build/chrome-mv3-prod.zip.

3. Load in Chrome

  1. 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-prod in terminal)
  2. Open chrome://extensions
  3. Enable Developer mode (top-right toggle)
  4. Click Load unpacked
  5. Select the extracted folder (build/chrome-mv3-prod)

4. Use It

  1. Highlight any text on a webpage that describes an event
  2. Right-click β†’ "Create Event with Schedio" or press Alt + Shift + S
  3. A modal appears with the parsed event details β€” edit if needed
  4. Click Add to Calendar β†’ done βœ…

🎯 How It Works

Highlight text β†’ Gemini AI extracts event details β†’ You review β†’ One click to Google Calendar
  1. You highlight text like "Team standup, Friday 3pm, Room 204"
  2. Gemini AI parses it into structured data (title, date, time, location)
  3. A modal overlay shows the parsed event for you to review or edit
  4. 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.


✨ Features

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

πŸ› οΈ Self-Hosted Setup

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.

Step 1: Get a Gemini API Key

  1. Go to Google AI Studio
  2. Sign in with your Google account
  3. Click Create API Key
  4. Copy the key

Step 2: Create a Google Cloud OAuth Client

  1. Go to the Google Cloud Console
  2. Create a new project (or select an existing one)
  3. Enable the Google Calendar API:
    • Go to APIs & Services β†’ Library
    • Search for Google Calendar API
    • Click Enable
  4. 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
  5. 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://extensions with Developer mode on)
    • Click Create
    • Copy the Client ID (looks like xxxx.apps.googleusercontent.com)

Step 3: Configure the Extension

  1. Create your .env.local in the project root:

    PLASMO_PUBLIC_GEMINI_API_KEY=your_gemini_api_key_here
  2. Update the OAuth client ID in package.json under manifest.oauth2:

    "oauth2": {
      "client_id": "YOUR_CLIENT_ID_HERE.apps.googleusercontent.com",
      "scopes": [
        "https://www.googleapis.com/auth/calendar.events"
      ]
    }
  3. Update the extension key in package.json under manifest.key:

    • This ensures a consistent extension ID across installs
    • You can generate one or remove the key field entirely for local development (Chrome will assign a random ID β€” just make sure it matches your OAuth client's Item ID)
  4. 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).

Step 4: Add Your Gemini Key in the Extension

Even after setting the .env.local key (which acts as the shared default), you can override it per-install:

  1. Right-click the Schedio extension icon β†’ Options
  2. Paste your Gemini API key
  3. Click Save

This key is stored locally in chrome.storage.local and is never sent anywhere except Google's Gemini API.


πŸ“ Project Structure

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

πŸ§‘β€πŸ’» Development

# Install dependencies
pnpm install

# Start dev server (hot reload)
pnpm dev

# Production build
pnpm build

# Package for distribution (.zip)
pnpm package

Load the dev build from .plasmo/chrome-mv3-dev during development.


βš™οΈ Architecture Notes

  • 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.

πŸ“ License

MIT Β© Arqam Waheed

About

Highlight text on any page, get a Google Calendar event in under 5 seconds. Chrome extension built with Plasmo and Gemini. GitHub Copilot CLI Challenge runner-up.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages