A macOS Electron app that unifies Google services — Gmail, YouTube, News, Calendar, and Play Library — behind a friendly, accessible home dashboard.
- Node.js 20+
- macOS (v1 target)
- A Google Cloud project with OAuth credentials
Follow these steps to configure OAuth and enable the required APIs.
- Go to Google Cloud Console
- Create a new project (e.g. "Googleplex")
In APIs & Services → Library, enable:
| API | Used for |
|---|---|
| Gmail API | Inbox threads and messages |
| YouTube Data API v3 | Subscriptions and video feed |
| Google Calendar API | Upcoming events on home dashboard |
| Data Portability API | Play Library (books, movies, music) — Phase 2 |
News uses public Google News RSS and does not require an API.
- Go to APIs & Services → OAuth consent screen
- Choose External (or Internal if using Google Workspace)
- Fill in app name, support email, and developer contact
- Add scopes:
openid,email,profilehttps://www.googleapis.com/auth/gmail.readonlyhttps://www.googleapis.com/auth/gmail.modifyhttps://www.googleapis.com/auth/gmail.composehttps://www.googleapis.com/auth/youtube.readonlyhttps://www.googleapis.com/auth/youtube.force-ssl(manage playlists, add videos)https://www.googleapis.com/auth/calendar.readonlyhttps://www.googleapis.com/auth/calendar.events(create events from Calendar tab)- (Phase 2)
https://www.googleapis.com/auth/dataportability.play.library - (Phase 2)
https://www.googleapis.com/auth/dataportability.youtube.music
- Add your Google account as a Test user
- Keep publishing status as Testing during development
- Go to APIs & Services → Credentials
- Click Create Credentials → OAuth client ID
- Application type: Desktop app
- Name: "Googleplex macOS"
- Copy the Client ID and Client secret
The app uses a loopback redirect (http://127.0.0.1:<port>/oauth/callback). For Desktop OAuth clients, Google allows loopback URIs automatically — no manual URI entry needed.
cp .env.example .envEdit .env:
GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-client-secret
npm install
npm run devnpm run build
npm run dist # Compiles with electron-vite, packages with electron-builderPackaging options live in electron-builder.json (not package.json). Output goes to release/.
For app icon, entitlements, code signing, and notarization, see build/README.md.
- Main process: OAuth (PKCE + system browser), JSON file cache, sync scheduler, service adapters
- Renderer: React + Tailwind UI with Home, Gmail, YouTube, Library, and Settings views
- Data sources: Official APIs first, Data Portability for Play Library, optional scraper fallback
After sign-in, users choose which services to connect. Each enabled service triggers incremental OAuth consent for its required scopes. Disabled connections never sync.
Play Library note: Google requires Data Portability scopes to be requested in a separate OAuth flow from Gmail, YouTube, and Calendar. Enabling Play Library opens a second consent screen with only Data Portability permissions.
| Service | Method | Interval |
|---|---|---|
| Gmail | Gmail API | 5–15 min (configurable) |
| YouTube | YouTube Data API | 15–30 min |
| News | Google News RSS | 15–30 min |
| Gemini | Gemini API (API key) | On demand |
| Calendar | Calendar API | 15–30 min |
| Play Library | Data Portability API | Once per 24 hours |
⌘1Home⌘2Gmail⌘3YouTube⌘4Calendar⌘5Library⌘6News⌘,Settings
The YouTube tab includes three sections:
- Feeds — subscriptions, uploads, activity, and liked videos (YouTube Data API)
- Playlists — your user-created playlists and their videos
- Mixes — auto-generated mixes fetched via yt-dlp (Python child process)
Mixes and video downloads require Python 3 and yt-dlp:
pip install -r scripts/requirements.txtThe app runs scripts/ytdlp_worker.py as a child process. Downloads use the folder set in Settings → YouTube download folder, or you can pick a folder when downloading from a video.
Note: Downloading YouTube videos may violate YouTube's Terms of Service. Use only for content you have the right to download.
- Gmail and YouTube require OAuth verification for public release; Testing mode supports up to 100 test users
- If star, archive, or send fail with a permissions error, go to Settings → Connections, toggle Gmail off and on, and re-consent to grant compose/modify access
- If playlist create/add fails, toggle YouTube off and on in Settings to grant
youtube.force-sslaccess - Data Portability exports are async batch jobs — library updates are not real-time
- The optional scraper may violate Google ToS; it is disabled by default