A macOS menu bar app that monitors timed events on your primary Google Calendar and displays full-screen notifications before they begin.
- Full-screen alerts — a frosted overlay with event details and a live countdown
- Google Calendar integration — read-only OAuth access via AppAuth with updates fetched every 30 seconds
- Accurate timing — schedules each known alert locally for its exact trigger time
- Configurable timing — trigger notifications 1, 2, 3, 5, 10, or 15 minutes before events
- Video call quick-join — detects links for Google Meet, Zoom, Microsoft Teams, Webex, and other common providers
- Focused monitoring — skips all-day and cancelled events
- Native menu bar UI — shows the next timed event and runs without a Dock icon
- Starts automatically — registers itself to launch when you log in
Run the installer directly from the repository:
curl -fsSL https://raw.githubusercontent.com/pmdarrow/full-screen-notification/main/scripts/install.sh | bashThe installer downloads the latest macOS release zip from
GitHub Releases,
extracts Full Screen Notification.app, and copies it into the system-wide
Applications folder:
/Applications/Full Screen Notification.app
Because this is a system-wide install, macOS will ask for an administrator password. The installer launches the app when it finishes; look for the bell in the menu bar. On its first launch, the app adds itself to System Settings → General → Login Items so it starts automatically on subsequent logins.
The app is ad-hoc signed, but it is not signed with an Apple Developer ID or notarized as I'm not really interested in paying to be a part of the Apple Developer Program. The installer removes the downloaded app's quarantine attribute so it can run on macOS.
- macOS 15 (Sequoia) or later
- Xcode 16+
- XcodeGen
- A Google Cloud project with the Calendar API enabled
- Go to the Google Cloud Console
- Configure the OAuth consent screen and add your Google account as a test user if the app is in testing mode
- Create an OAuth 2.0 Client ID and choose Desktop app as the application type
- Note your client ID — it looks like
123456789-abcdef.apps.googleusercontent.com
The app uses AppAuth's authorization-code flow with PKCE and a temporary loopback
callback on 127.0.0.1. Google's Desktop OAuth token exchange also requires the
client secret issued with the client ID. Desktop apps cannot keep that value
confidential, so it is stored only in the ignored local build configuration and
embedded in release builds. A custom URL scheme is not required. The app
requests the calendar.readonly scope, so it can read events but cannot create,
edit, or delete them.
# Clone the repo
git clone https://github.com/pmdarrow/full-screen-notification.git
cd full-screen-notification
# Create your local config
cp project.local.example.yml project.local.ymlEdit project.local.yml with your values:
targets:
FullScreenNotification:
settings:
base:
DEVELOPMENT_TEAM: YOUR_TEAM_ID
GOOGLE_CLIENT_ID: YOUR_CLIENT_ID.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET: YOUR_CLIENT_SECRETThen generate the Xcode project and build:
xcodegen
# Build from the command line
xcodebuild -project FullScreenNotification.xcodeproj -scheme FullScreenNotification build
# Run
open ~/Library/Developer/Xcode/DerivedData/FullScreenNotification-*/Build/Products/Debug/Full\ Screen\ Notification.app
# Or open in Xcode and hit Cmd+R
open FullScreenNotification.xcodeprojThe release helper builds a universal Apple Silicon and Intel app, ad-hoc signs
it, packages it as dist/full-screen-notification-<version>-macos.zip, and
uploads it to a GitHub release tagged v<version>. Before releasing, update
MARKETING_VERSION and CURRENT_PROJECT_VERSION in project.yml, then commit
and push that change.
bash scripts/create-github-release.shUse --draft to create a draft release first:
bash scripts/create-github-release.sh --draftThe script requires a clean working tree and a current branch that is pushed to GitHub, so the release tag matches the packaged source. To test the universal build and packaging without publishing a release:
bash scripts/create-github-release.sh --dry-runMIT