A minimal, lightweight desktop app that watches a GitHub repository and notifies you the moment anyone commits, even while it runs quietly in the background.
Built with Tauri 2 and vanilla TypeScript, dark UI. No account, no login, no database. Just paste a repo and go.
I built this for myself. I was refreshing a repository over and over waiting for a push, and I wanted a tiny thing sitting in the tray that would tell me the second a new commit landed so I could stop checking.
- Instant commit notifications - native system notification plus an animated in-app row for every new commit on any branch.
- Runs in the background - minimize to the system tray and keep polling while you work.
- Zero-login - watch any public repo instantly; private repos and a higher rate limit are one optional token away.
- Tracks all branches - detects pushes to any branch, not just the default.
- Liquid-glass dark UI - translucent window with acrylic/mica backdrop, hairline commit rows, and spring-based animations.
- Persists watched repos - your watch list and last-known commits survive restarts.
- Tiny footprint - a single ~5 MB native binary, far lighter than Electron.
- Node.js 18+
- Rust (stable toolchain)
- Platform webview: WebView2 (Windows), WebKitGTK (Linux), WKWebView (macOS) — see Tauri prerequisites
npm install
npm run tauri devThe app opens with an empty feed. Enter a repository — owner/repo or a full https://github.com/owner/repo URL — and press the + button to start watching.
npm run tauri buildThe output binary/installer is written to src-tauri/target/release/bundle/. Installing it registers the app's notification identity (so toasts show GH Notify instead of a terminal name).
| Action | How |
|---|---|
| Watch a repo | Type owner/repo or a GitHub URL, press + |
| Stop watching | Hover a repo's section header and press ✕ |
| Keep checking in background | Close the window — it hides to the tray and keeps polling |
| Open the window again | Tray icon → Show |
| Quit | Tray icon → Quit |
Public repos work with no login. The unauthenticated GitHub API is capped at 60 requests/hour — plenty for a few repos at the default 60-second poll.
For private repos or heavier polling, add a personal access token to localStorage:
localStorage.setItem("ghnotif.token", "github_pat_...")(Or set ghnotif.token via the browser console in the app's devtools.)
The app polls every 60 seconds by default. Adjust POLL_MS in src/main.ts.
ghnotif/
├── src/ # Frontend (vanilla TS + CSS)
│ ├── main.ts # UI, polling loop, notifications
│ ├── styles.css # Apple-style liquid-glass dark theme
│ └── lib/
│ ├── api.ts # GitHub REST client (branches, commits)
│ ├── store.ts # localStorage persistence
│ └── types.ts # Shared types
├── src-tauri/ # Rust shell
│ └── src/lib.rs # Tray, acrylic window, notification log
└── app-icon.svg # Source icon
- On watch, the app snapshots the current head commit of every branch.
- Every 60s it fetches fresh commits per branch and diffs against the snapshot.
- Any commits newer than the snapshot trigger a notification and an animated row, then the snapshot advances.
- Diagnostics are appended to
%APPDATA%/com.ghnotif.app/ghnotif.log.
- Tauri 2 — tiny native cross-platform shell
- Vanilla TypeScript + Vite — no heavy frontend framework
- GitHub REST API — public, no auth required
window-vibrancy— acrylic/mica translucency
- Optional token input in the UI (no console needed)
- Webhook-based instant pushes (instead of polling)
- Notification click opens the commit on GitHub
MIT