Skip to content

Repository files navigation

Full Screen Notification

A macOS menu bar app that monitors timed events on your primary Google Calendar and displays full-screen notifications before they begin.

macOS 15+ Swift 6

Sample full-screen notification

Overview

  • 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, cancelled, and declined 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

Install

Run the installer directly from the repository:

curl -fsSL https://raw.githubusercontent.com/pmdarrow/full-screen-notification/main/scripts/install.sh | bash

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

Development

Prerequisites

  • macOS 15 (Sequoia) or later
  • Xcode 16+
  • XcodeGen
  • A Google Cloud project with the Calendar API enabled

Google OAuth credentials

  1. Go to the Google Cloud Console
  2. Configure the OAuth consent screen, then set the app's publishing status to In production
  3. Create an OAuth 2.0 Client ID and choose Desktop app as the application type
  4. 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. Include the client secret generated with the Desktop OAuth client because Google's token endpoint requires it for this client. 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.

Google limits refresh tokens for external OAuth apps in Testing to seven days when Calendar access is requested. Publishing the app removes that testing limit; the app can remain unverified for personal use.

Logs

The app writes authentication, Keychain, and Calendar request diagnostics to:

~/Library/Logs/Full Screen Notification/full-screen-notification.log

The log contains token-presence flags, but the app does not intentionally log token values or account email addresses. It rotates at 2 MB and retains one previous file alongside the current log.

Building

# 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.yml

Edit 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_SECRET

Then 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.xcodeproj

Creating a GitHub release

The 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.sh

Use --draft to create a draft release first:

bash scripts/create-github-release.sh --draft

The 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-run

License

MIT

About

A macOS menu bar app that displays full-screen notifications for upcoming Google Calendar events

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages