Privacy-first coding-time tracker
Tracks edit-time per project / language to a local JSONL file (no cloud, no MongoDB) and renders a SugarCharts-driven dashboard. Editor plug-ins push heartbeats via the tick push CLI subcommand; the dashboard reads them.
composer require sugarcraft/candy-codetime
# Editor plug-in / cron / git hook pushes a heartbeat:
candy-codetime push sugarcraft php src/App.php 60
# Open the dashboard:
candy-codetime
# Override the data dir:
CANDY_CODETIME_DIR=/var/data/tick candy-codetime
Formerly shipped as sugar-tick: the old SUGARTICK_DIR // @rename-keep
env var and the ~/.local/share/sugar-tick data directory are still // @rename-keep
honoured once and migrated automatically on first launch.
{time, project, language, file, duration} — JSONL, one beat per line.YYYY-MM-DD.jsonl per day — append-only, easy to ship to cold storage.Sparkline driven by per-day minute buckets.← / → shift the 7-day window; r reloads.Stats::compute is total-input deterministic — every dashboard test runs against fixed beats.| Class | Method | Description |
|---|---|---|
| Stats | compute(heartbeats) | Compute statistics from heartbeats |
| Heartbeat | new(time, project, language, file, duration) | Create a heartbeat |
| Dashboard | new(stats) | Create dashboard view |
| App | start() | Create the app model |
VHS-recorded GIFs of every example shipped with the app. Regenerated automatically on every push that touches the source.