Lightweight macOS menu bar app for Clockify time tracking
  • Swift 89.7%
  • Shell 10.3%
Find a file
Paweł Orzech 5886e1a5af Center content at 560px and extend background to full window width
The previous frame capped ContentView at maxWidth: 600 inside a window
that could grow wider, leaving the system's default white area visible
between the ZStack and the window edges. Now the content column stays
at 560px and is wrapped in a full-width container painted with
DS.Palette.bg, so resizing the window only adds matching warm-neutral
margins.
2026-04-27 10:00:00 +02:00
docs/superpowers Add native macOS redesign implementation plan 2026-03-23 16:25:08 +01:00
scripts Center content at 560px and extend background to full window width 2026-04-27 10:00:00 +02:00
Sources/cocotrack Center content at 560px and extend background to full window width 2026-04-27 10:00:00 +02:00
Tests/cocotrackTests Harden network handling: https-only base URL, sanitized errors 2026-04-27 09:51:16 +02:00
.gitignore Make MAS build pipeline produce a valid App Store package 2026-04-21 18:02:24 +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

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.