Personal project. I built this because I have too many repos and kept losing track of what's active. Maintenance will be sporadic — I fix things when I need them. Contributions are welcome but response times may vary.
Swift 6 · SwiftUI · macOS 14+

Catnap

A native macOS menubar dashboard that scans your local git repos and shows live status with GitHub enrichment.

Catnap showing compact, expanded, and loading states

Features

📋

Live Repo Status

Scans your repos directory and shows status dots, dirty indicators, and relative timestamps at a glance.

⌨️

Option+Click

Hold Option while clicking for expanded view with GitHub descriptions pulled via the gh CLI.

📁

Category Groups

Organize repos into collapsible categories. Collapse state persists across sessions.

🔄

Background Polling

Configurable refresh interval keeps your dashboard up to date without manual intervention.

Lightweight

~3 MB binary, ~15 MB RAM. Native Swift with no webview, no Electron, no runtime overhead.

⚙️

Configurable

JSON config for scan path, GitHub owner, active/stale thresholds, categories, and refresh interval.

Views

Compact view Click — Compact
Expanded view Option+Click — Expanded
Loading state Loading State

Get Started

Clone, build, done. No dependencies to install.

# clone and run
git clone https://github.com/alexcatdad/catnap.git
cd catnap
make run
macOS 14+ (Sonoma)
MenuBarExtra .window style and Observation framework
Swift 6
Comes with Xcode 16+ or CLI tools
git
Ships with macOS. Used for repo scanning.
gh CLI optional
For GitHub descriptions. Install via brew install gh

Make It Yours

Designed to be forked and personalized. No external Swift dependencies to worry about.

01
Fork & clone
Fork on GitHub, clone your copy locally
02
Edit config
Set your scanPath and githubOwner in config.json
03
Define categories
Group your repos however makes sense for your workflow
04
make run
Build, bundle, and launch. That's it.

Security

No network access

The app never makes HTTP requests. GitHub data is fetched by shelling out to gh, which handles its own auth.

No sandbox

Runs with ad-hoc codesign, no App Sandbox. Needs filesystem access to scan repos and execute git/gh.

Safe shell execution

Arguments passed as arrays via Foundation.Process, not string interpolation. No shell injection vectors.

No secrets stored

Config contains only paths, repo names, and cached descriptions. No tokens, passwords, or credentials.

No telemetry

No analytics, crash reporting, or phoning home. Runs entirely offline except for gh CLI calls.

Report issues

Found a vulnerability? Open a GitHub issue or reach out directly. Please avoid public disclosure until patched.

Swift 6 SwiftUI MenuBarExtra Observation SPM Foundation Process gh CLI