Lightweight macOS menu bar app for Clockify time tracking
  • Swift 91%
  • Shell 9%
Find a file
Paweł Orzech 222c570518 Merge feature/audit-fixes: audit 2026-07-23
Fixes API key loss on non-entitled builds, stops time entry edits from
wiping tags and task assignments, adds an accessibility layer, brings the
palette to WCAG AA, restores Polish diacritics and hardens both build
scripts. Tests: 17 -> 52.
2026-07-23 10:19:49 +02:00
docs/superpowers Add native macOS redesign implementation plan 2026-03-23 16:25:08 +01:00
scripts Add accessibility layer, fix contrast, Polish diacritics and 24h time 2026-07-23 10:16:35 +02:00
Sources/cocotrack Stop edits from wiping tags and task assignment on time entries 2026-07-23 10:06:00 +02:00
Tests/cocotrackTests Stop edits from wiping tags and task assignment on time entries 2026-07-23 10:06:00 +02:00
.gitignore Make MAS build pipeline produce a valid App Store package 2026-04-21 18:02:24 +02:00
AUDIT_REPORT.md Add audit report, UX recommendations and agent changelog 2026-07-23 10:16:44 +02:00
CHANGELOG_AGENT.md Add audit report, UX recommendations and agent changelog 2026-07-23 10:16:44 +02:00
CLAUDE.md Add MAS build pipeline, marketing copy and rewrite README 2026-04-21 16:51:00 +02:00
LICENSE Add MAS build pipeline, marketing copy and rewrite README 2026-04-21 16:51:00 +02:00
marketing.md Add MAS build pipeline, marketing copy and rewrite README 2026-04-21 16:51:00 +02:00
Package.swift Support force-projects workspaces (start/stop) 2026-03-09 15:44:13 +01:00
README.md Add MAS build pipeline, marketing copy and rewrite README 2026-04-21 16:51:00 +02:00
UX_RECOMMENDATIONS.md Add audit report, UX recommendations and agent changelog 2026-07-23 10:16:44 +02:00

Cocotrack

A lightweight macOS menu bar time tracker that works with Clockify. Start, stop, and manage timers without leaving your workflow.

Cocotrack is an independent app by Cocolab sp. z o.o. Not affiliated with, endorsed by, or sponsored by CAKE.com or Clockify.

Features

  • Menu bar timer — see your running timer and elapsed time right in the macOS menu bar
  • One-click start/stop — start tracking from the menu bar popover or the main window
  • Quick start templates — reuse descriptions from your recent time entries
  • Favorites — pin frequently used timer descriptions for instant access
  • Entry editing — edit descriptions and timestamps of existing entries
  • Auto-refresh — entries sync from Clockify every 30 seconds
  • Localized — Polish (default) and English, follows your system language
  • Zero dependencies — pure Swift + SwiftUI, no third-party libraries

Requirements

  • macOS 13.0 (Ventura) or later
  • A Clockify account and API key

Installation

Mac App Store

(Coming soon.)

Build from source

git clone https://github.com/getlineapp/cocotrack.git
cd cocotrack

swift build
swift run

# Or build a distributable .app bundle
./scripts/build_direct_distribution.sh

The build script produces dist/Cocotrack.app, a .zip, and a .dmg. Set SIGN_IDENTITY and NOTARIZE_PROFILE environment variables for code signing and notarization.

Setup

  1. Launch Cocotrack
  2. Open Settings (gear icon)
  3. Paste your Clockify API key — get one at clockify.me/user/settings
  4. Click Save & Connect

The app uses your default Clockify workspace. To use a different one, enter its workspace ID in Settings.

Architecture

Sources/cocotrack/
├── CocotrackApp.swift        # App entry point, window + menu bar scenes
├── AppState.swift            # Central state: API calls, timer, settings
├── ClockifyAPIClient.swift   # Stateless REST client for Clockify API v1
├── ClockifyModels.swift      # Codable request/response types
├── Formatters.swift          # ISO 8601 date coding, display formatters
├── ContentView.swift         # Main window UI (timer, favorites, history)
├── MenuBarView.swift         # Menu bar popover UI
├── L10n.swift                # Type-safe localized string constants
└── Resources/
    ├── pl.lproj/Localizable.strings  # Polish (default)
    └── en.lproj/Localizable.strings  # English

Built with Swift concurrency (async/await) and SwiftUI. AppState is the single source of truth, shared to both UI surfaces via @EnvironmentObject. No Combine, no external frameworks.

License

MIT License — see LICENSE for details.