A local-first macOS productivity tracker. Passively monitors which applications you use and for how long — all data stays on your machine.
- personal/ — Swift macOS app (menu bar + dashboard window)
- server/ — Java Spring Boot backend with PostgreSQL
- extension/ — Chrome/Brave browser extension for per-site tracking
./personale setup # one-time: deps check + secret-scan git hooks
./personale up # start Postgres + backend + open the app (builds if stale)
./personale status # see what's running
./personale install # autostart backend + app at login (optional)Run ./personale help for the full subcommand list.
cd server && docker compose up -d # Postgres
./gradlew --no-daemon bootRun # backend on :8696
open ../personal/personal.xcodeproj # Xcode → Cmd+RBreaks down browser time by website (e.g. GitHub = Code, YouTube = Media) instead of just "Chrome."
cd extension && npm install && npx tscThen load in Chrome/Brave:
- Go to
chrome://extensions(orbrave://extensions) - Enable Developer mode
- Click Load unpacked → select the
extension/folder - The extension options page lets you configure the server URL and excluded domains
The macOS app has a settings page (gear icon in sidebar):
- Server URL — default
http://localhost:8696 - Work day — configure start hour, end hour, and daily target
- Idle thresholds — per-category (Code: 180s, Media: 60s, etc.)
- Launch at login — toggle
POST /api/events— Record an app switchPOST /api/events/close— Close the active session (sleep/idle)POST /api/events/browser— Record a browser tab changeGET /api/stats/today— Today's time-per-app statsGET /api/stats/day?date=— Stats for a specific dayGET /api/stats/timeline?date=— Merged session blocksGET /api/stats/categories?date=— Time by category (enriched with browser data)GET /api/stats/range?from=&to=— Per-day breakdown over a date rangeGET /api/stats/range/summary?from=&to=— Aggregate stats for a rangeGET /api/health— Server health check