← all projects

timetracker

Minimal GTK4 time tracking desktop app for elementaryOS, built in Python
repo desktop-app elementaryos gtk4 linux python timetracker

Time Tracker

Minimal GTK4 time tracking app for elementaryOS. Stays small so you can keep it on screen all day.

Screenshot from 2026-06-23 13 57 06

Requirements

On elementaryOS / Ubuntu these are typically pre-installed. If not:

sudo apt install python3-gi gir1.2-notify-0.7

Run

make run
# or
python3 timetracker.py

Pass --debug to log system D-Bus signal activity (lock/unlock/sleep events) to stderr — useful when diagnosing auto-pause issues.

Install

make install

Copies the script to ~/.local/bin/timetracker and registers a .desktop entry so it appears in the app launcher.

Usage

| Action | How | |---|---| | Start tracking | Click an activity | | Pause | Click the active activity again | | Switch activity | Click a different activity (pauses current) | | Track multiple activities at once | Ctrl+click additional activities | | Split tracked time across activities | While tracking, ctrl+click others — time splits evenly, live, across all active activities | | Add activity | Click + Add activity | | Remove activity | Right-click an activity | | Archive day | Click Archive | | Set working hours | Click the gear icon | | Mini mode | Ctrl+M | | Edit time | Right-click an activity → Edit time |

Auto-pause on lock / sleep

The timer pauses automatically when the screen locks or the computer sleeps, and resumes when you unlock or wake. A desktop notification confirms the resume. Time spent locked or asleep is never counted.

Working hours

Set a start and end time (HH:MM) via the gear icon. At the start time you get a desktop notification. At the end time the day is archived automatically.

Data

| File | Contents | |---|---| | ~/.config/timetracker/config.json | Activities, accumulated time, working hours | | ~/.local/share/timetracker/archive.jsonl | One archived day per line |

Archive format:

{"date": "2026-06-23", "archived_at": "2026-06-23T17:30:00", "activities": [{"name": "Deep work", "seconds": 14400}]}