A privacy-first macOS time tracking application with enhanced features for manual time entry addition and webhook notifications.
- Menu Bar Integration: Lives quietly in your menu bar until you need it
- Auto-Start: Optionally launch the app automatically when you log in to your Mac
- Client/Project Tracking: Organize your work by clients and projects
- 100% Local Operation: All data stored locally on your Mac
- Manual Time Entry: Add and edit time entries after the fact
- Earnings Tracking: Set hourly rates and track earnings
- Privacy-First: No cloud sync, no telemetry, complete data control
- Webhook Notifications: Optional outbound notifications to external systems. For example create invoices for last month with n8n.
- Secure Delivery: HTTPS-only webhooks with HMAC signatures
- Retry Logic: Automatic retry with exponential backoff
- User Control: Webhooks are completely optional and user-configured
This application follows a local-first architecture. It uses SwiftUI for the UI and Core Data for the data storage.
- macOS 12.0+ (Monterey)
- Xcode 14.0+
- Swift 5.7+
- Clone the repository:
git clone <repository-url>
cd timetracker- Open the project in Xcode:
open EnhancedTimeTracker.xcodeproj- Build and run the project (⌘+R)
The app is currently not really distributed, since it is a personal project. You can download the latest release from the Releases page.
- Launch the App: The app runs from the menu bar - look for the clock icon
- Auto-Start Setup: Go to Settings → General to enable "Launch at login" if desired
- Add Clients: Go to Settings → Clients to add your clients
- Add Projects: Go to Settings → Projects to add projects for each client
- Start Tracking: Click the menu bar icon to start/stop timers
- Click the menu bar icon
- Select "Add Time Entry"
- Choose client and project
- Enter description and time range
- Save the entry
- Go to Settings → Webhooks
- Click "Add Webhook"
- Configure:
- Name: Descriptive name for the webhook
- URL: HTTPS endpoint to receive notifications
- Secret: Optional HMAC secret for security
- Events: Select which events to send
- Retry Settings: Configure retry attempts and timeout
The app sends the following events:
- time_entry_created (when a new time entry is created)
- time_entry_updated (when a time entry is modified)
- time_entry_deleted (when a time entry is deleted)
- time_entry_started (when a timer is started)
- time_entry_stopped (when a timer is stopped)
- project_created (when a new project is created)
- project_updated (when a project is modified)
- client_created (when a new client is created)
- client_updated (when a client is modified)
- on_invoice_created (when a invoice-creation is triggered)
{
"event": "time_entry_created",
"timestamp": "2024-01-15T10:30:00Z",
"signature": "sha256=abc123...",
"data": {
"id": "entry_123",
"clientId": "client_456",
"projectId": "project_789",
"description": "Working on feature X",
"startTime": "2024-01-15T09:00:00Z",
"endTime": "2024-01-15T10:30:00Z",
"duration": 90,
"isManual": false
}
}- 100% Local Storage: All data stored locally on your Mac
- No Cloud Sync: No cloud synchronization whatsoever
- No Telemetry: No usage tracking or analytics
- User Control: Complete control over data and webhook configuration
- HTTPS Only: Enforced for all webhook URLs
- HMAC Signatures: Request authenticity verification
- User Choice: Webhooks are completely optional
- No Inbound: App never receives external data
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
- Inspired by Daily Grind Time Tracker
- Built with SwiftUI and Core Data
- Privacy-first design principles
- Build a lot with the help of Cursor. I reviewed most of the code, but don't guarantee that I overlooked some really bad code.
