What it collects
The Desktop Agent only tracks which application is focused and for how long. It does not record keystrokes, screenshots, file contents, microphone audio, or clipboard data.
Activity record
Each synced activity looks like this conceptually:
{
"platform": "Linux",
"program_name": "firefox",
"path": "/usr/lib/firefox/firefox",
"filename": "firefox",
"time": 40,
"date": "2026-08-07",
"hour": 14
}
| Field | Meaning |
|---|---|
platform | OS label: Linux, Windows, or Darwin |
program_name | Best available app identity (window class, exe basename, or title) |
path | Absolute path to the process executable when the OS allows it |
filename | Basename derived from path (or empty if path is unknown) |
time | Seconds of focused time in this bucket |
date | Calendar day (YYYY-MM-DD) for the bucket |
hour | Hour of day (0–23) for the bucket |
How bucketing works
- Every poll interval (default 10 seconds) the agent reads the focused window.
- Time since the previous successful sample is added to the bucket for the previous window.
- Buckets are keyed by platform + program + path + filename + date + hour.
- Every flush interval (default 10 seconds) non-empty buckets are written to the local SQLite offline queue.
- Every sync interval (default 10 seconds) pending rows are uploaded in batches (default up to 200 rows per request).
If the focused window cannot be resolved, that poll is skipped for attribution (you may see a throttled warning in logs/agent.log), and the timer still advances so the previous app is not over-credited forever.
Authentication data stored locally
After login, the agent stores a session in data/agent.db:
- access token
- token expiry timestamp
- gateway URL used for that session
Password is never written to disk. Device-flow codes exist only in memory for the duration of the login prompt.
Local files on disk
Created next to the working directory:
| Path | Purpose |
|---|---|
data/agent.db | Auth session + offline activity queue |
data/agent.pid | PID of the running worker |
data/agent.disabled | Presence means tracking is intentionally stopped |
data/gnome-shell-restarted | Marker so GNOME Shell is restarted at most once for helper setup |
logs/agent.log | Worker logs (start/stop, sync warnings, tracker errors) |
On Linux KDE, the KWin helper may also write:
| Path | Purpose |
|---|---|
$XDG_RUNTIME_DIR/analog-waketime-focused.json | Last focused window payload from the KWin script |
What we do not collect with the agent
- Source code or buffer contents
- Keylogging / mouse coordinates streams
- Screenshots or screen recording
- Browser history or URLs (only the browser process identity if it is focused)
- System passwords or wallet secrets
- Full process lists beyond the single focused window
For account-level personal data stored on the server (email, profile, etc.), see the site-wide Data Collection and Data Policy docs.
Privacy notes for desktop tracking
- Window titles may be used as a fallback name when class/path is missing. Titles can contain document names (for example a file open in an editor). Prefer environments where WM class / exe path is available (GNOME extension, KWin script, Hyprland, Windows).
- Executable paths reveal which apps you use, not which files you edited inside them.
- You can stop collection at any time with
Analog-WakaTime-Agent stop. Offline rows already queued remain indata/agent.dbuntil synced or until you delete that database.