TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Automatic time tracking for macOS — Know exactly where your time goes. GrotTrack lives in your menu bar, silently tracking app usage, browser tabs, and screenshots, then turns it all into actionable focus reports. All data stays on your Mac.
Built for Grafana Labs employees.README 전문 보기 ↗Automatic time tracking for macOS — Know exactly where your time goes. GrotTrack lives in your menu bar, silently tracking app usage, browser tabs, and screenshots, then turns it all into actionable focus reports. All data stays on your Mac.
Built for Grafana Labs employees.
Polls the frontmost app every 3 seconds via AXUIElement and NSWorkspace. Captures app name, bundle ID, window title, and (with the Chrome extension) the active browser tab title and URL. Events are written to SwiftData in real time.
Captures the screen every 30 seconds (configurable 15–120s) using ScreenCaptureKit. Saves as WebP at 1280px max / 80% quality (~30–50 KB each) with auto-generated thumbnails. An enrichment pipeline runs OCR (Vision framework) and extracts entities like URLs, file paths, git branches, JIRA keys, and meeting links.
A rolling 5-minute window algorithm scores your focus level (0.0–1.0) based on:
Three tiers: Focused (green), Moderate (yellow), Distracted (red). Scores appear on timeline entries, in the menu bar, and in trend reports.
The SessionDetector groups activity events into sessions based on app switches, browser domain changes, and idle gaps. When Apple Intelligence is available (macOS 26+), the SessionClassifier labels each session with a human-readable task name and project (e.g. "grotTrack: code review") — entirely on-device.
A dedicated window with four view modes:
Includes full-text search, app and focus-level filtering, date navigation, and keyboard shortcuts.
Grid view with zoomable thumbnails or a detail viewer. Search by OCR text or extracted entities. Navigate by date with keyboard shortcuts.
Weekly and monthly views with:
Reports are cached as SwiftData models and can be regenerated on demand. Exportable as JSON or CSV.
Press Ctrl+Shift+N (customizable) to pop open a floating panel and jot a quick note. The annotation captures your current app, window title, and browser context automatically. Annotations appear inline on the timeline.
The popover shows:
Automatically pauses tracking after 5 minutes of inactivity. Detects system sleep, screen lock, and session resign events. Resumes when you return.
Exclude specific apps from tracking by bundle ID. Add from a list of running apps or enter manually.
Export a day's data as JSON (structured hourly blocks, sessions, annotations) or CSV (spreadsheet-friendly rows). Trend reports are also exportable.
The Timeline export menu also includes Export for LLM..., which writes a local evidence bundle for a selected date or date range. Bundles include a manifest.json, README, activity/session/annotation metadata, OCR/entity enrichments, hourly summaries, an app summary CSV, and a curated evidence/screenshots/ set designed for Claude, ChatGPT, or another agent with vision support. The default smart evidence mode caps screenshots to control cost; choose Smart Evidence + Full Archive only when the consuming agent really needs every screenshot.
brew install justgit clone <repo-url>
cd grotTrack
just setup
open GrotTrack.xcodeproj
Build and run (Cmd+R) in Xcode.
chrome://extensions in Chromegrot-track-extension/.output/chrome-mv3Access via the menu bar icon > Settings (Cmd+,):
| Tab | What you can configure |
|---|---|
| General | Polling interval (1–10s), screenshot interval (15–120s), launch at login, start tracking on launch, appearance (System/Light/Dark), customizable hotkeys |
| Permissions | Accessibility & Screen Recording status with quick-fix links |
| Browser | Chrome native messaging host install/update/uninstall, extension ID |
| Storage | Disk usage stats, screenshot retention (1–30 days), thumbnail retention (7–90 days), manual cleanup |
| Exclusions | Apps to exclude from tracking (by bundle ID) |
| About | Version, build number, credits |
| Shortcut | Action |
|---|---|
| Ctrl+Shift+G | Pause / resume tracking |
| Ctrl+Shift+N | Quick annotation |
| Shortcut | Action |
|---|---|
| Cmd+1 | Open Timeline |
| Cmd+2 | Open Trends |
| Cmd+3 | Open Screenshots |
| Cmd+, | Open Settings |
| Cmd+? | Show all shortcuts |
| Cmd+[ / Cmd+] | Previous / next day |
| Cmd+T | Jump to today |
| Cmd+E | Expand / collapse all |
Global hotkeys are customizable in Settings > General.
Data lives in ~/Library/Application Support/GrotTrack/:
GrotTrack.store — SwiftData database
Screenshots/YYYY-MM-DD/ — Full screenshots (~30-50KB WebP each)
Thumbnails/YYYY-MM-DD/ — Thumbnail previews (~3-7KB each)
Exports/ — Exported reports and LLM evidence bundles
Retention: Full screenshots kept for 7 days, thumbnails for 30 days (both configurable). Cleanup runs automatically on launch and can be triggered in Settings.
Estimated storage: ~30–50 MB/day at 30s intervals, ~210–350 MB/week.
The Chrome extension pushes active tab data to GrotTrack via Chrome's Native Messaging protocol. No Automation (Apple Events) permission required.
just build-extension
Output: .output/chrome-mv3/
The extension listens for tab/window events and pushes the active tab's title and URL to the native messaging host (GrotTrackNativeHost, bundled inside GrotTrack.app). The host relays data to the main app via DistributedNotificationCenter. ActivityTracker reads the cached tab data on each poll cycle.
MVVM with @Observable | Swift 6 (strict concurrency) | SwiftUI | SwiftData | macOS 26+
See arch.txt for the full architecture document.
| Service | Responsibility |
|---|---|
ActivityTracker | Polls frontmost app via AXUIElement + NSWorkspace every 3s |
ScreenshotManager | Captures via ScreenCaptureKit, stores WebP + thumbnails |
MultitaskingDetector | Rolling 5-min window scoring with CGWindowList enrichment |
SessionDetector | Groups events into sessions by app/domain/idle boundaries |
SessionClassifier | Labels sessions via Apple Intelligence (FoundationModels) |
ScreenshotEnrichmentService | OCR + entity extraction pipeline for screenshots |
ReportGenerator | Aggregates data into weekly/monthly trend reports |
BrowserTabService | Receives tab data from Chrome extension via DistributedNotificationCenter |
IdleDetector | Monitors inactivity, sleep, and screen lock events |
TimeBlockAggregator | Groups events into hourly TimeBlock records |
grotTrack/
├── GrotTrack/ — Main app source
│ ├── Models/ — SwiftData @Model classes
│ ├── ViewModels/ — @Observable view models
│ ├── Services/ — Core services
│ ├── Views/
│ │ ├── MenuBar/ — Menu bar popover
│ │ ├── Timeline/ — Timeline, sessions, stats views
│ │ ├── Reports/ — Trends and app breakdown views
│ │ ├── Screenshots/ — Screenshot browser
│ │ ├── Settings/ — Settings tabs
│ │ ├── Components/ — Shared components (heatmap, focus indicators, etc.)
│ │ └── Onboarding/ — First-launch walkthrough
│ └── Utilities/ — Extensions, helpers
├── GrotTrackNativeHost/ — Chrome native messaging host binary
├── GrotTrackTests/ — Unit tests
├── grot-track-extension/ — Chrome extension (WXT/TypeScript)
├── project.yml — XcodeGen project definition
└── arch.txt — Architecture document
The Xcode project is generated from project.yml:
just xcodeproj
Re-run after adding or removing source files.
just test
just lint
TBD