Protect your Google Calendar from runaway meetings. Once your accepted meetings on a given workday hit a configured budget, Meeting Budget Manager fills the remaining open slots with focus-time blocks that auto-decline new invites — so co-workers can't pile on yet another pow-wow.
The popup copy reads like a 1950s used-car ad. That's on purpose.
Two independent ports of the same product live in this repo:
Extension/code/— A Chrome MV3 extension. Also published on the Chrome Web Store asaljklfcciklemdggglfadodpkngdcphp.AppScript/— A Google Apps Script web app. Same algorithm, different host. This version exists because some Google Workspace environments restrict third-party Chrome extensions; the Apps Script port runs entirely inside Google's own infrastructure and side-steps that restriction.
They are not built from shared source. When you fix a bug in one, mirror the fix to the other. See CLAUDE.md for the platform-level differences that remain.
The easiest path is the published Chrome Web Store listing. To run from source instead:
- Go to
chrome://extensionsand enable Developer Mode. - Click "Load unpacked" and select the
Extension/code/directory. - Click the extension's toolbar icon to open the popup, configure your settings, and click Rev Up My Sched!.
The first run will prompt for Google Calendar OAuth.
- Create a new project at https://script.google.com.
- Enable the Advanced Calendar Service: Services → Calendar (this exposes
Calendar.EventsandCalendar.Calendars). - Paste the contents of
AppScript/code.jsintoCode.gs. - Add an HTML file named
popup(matching thedoGetreference) and paste inAppScript/popup.html. - Deploy → New deployment → Web app (execute as: me, access: only me).
- Open the web-app URL, configure your settings, and click Rev Up My Sched!.
The first run will prompt for Calendar and Gmail scopes (Gmail is used to email you the daily Cruise Control summary).
| Setting | What it does |
|---|---|
| Workdays + working hours | Per-day on/off plus start/end time. Only these windows are scanned. |
| Daily Meeting Budget | Hours of accepted meetings that triggers focus-time blocking on that day. |
| Sched Scoutin' Horizon | How many workdays ahead to scan. |
| Shortest Work Pit Stop | Minimum gap size that becomes a focus-time block. Smaller gaps are skipped. |
| Gear Shift | Test Drive previews changes only; Full Throttle actually writes events. |
| Cruise Control On! | Runs the scan automatically once a day. |
For each upcoming workday in the configured horizon:
- Fetch all events in your working window from your primary calendar.
- Filter to default events you've accepted (
responseStatus === 'accepted'on your self-attendee record). - Round start/end times to the nearest 15 minutes, merge overlapping intervals, sum the total meeting hours.
- If total ≥ daily budget, find gaps within the working window that aren't already blocked by meetings, existing focus time, or out-of-office events.
- In Full Throttle, delete any focus-time events this tool previously created, then insert new focus-time events covering the gaps with
autoDeclineMode: declineAllConflictingInvitations.
Both implementations only delete focus-time events they own — events created by Meeting Budget Manager are tagged with extendedProperties.private.createdBy === 'MeetingBudgetManager'. Focus-time you create by hand is left alone.
Bugs and suggestions welcome via GitHub Issues. Note that any fix typically needs to be mirrored to both the Extension and the Apps Script copies — CLAUDE.md describes what differs between them.
MIT — see LICENSE.
