Skip to main content

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
}
FieldMeaning
platformOS label: Linux, Windows, or Darwin
program_nameBest available app identity (window class, exe basename, or title)
pathAbsolute path to the process executable when the OS allows it
filenameBasename derived from path (or empty if path is unknown)
timeSeconds of focused time in this bucket
dateCalendar day (YYYY-MM-DD) for the bucket
hourHour of day (0–23) for the bucket

How bucketing works

  1. Every poll interval (default 10 seconds) the agent reads the focused window.
  2. Time since the previous successful sample is added to the bucket for the previous window.
  3. Buckets are keyed by platform + program + path + filename + date + hour.
  4. Every flush interval (default 10 seconds) non-empty buckets are written to the local SQLite offline queue.
  5. 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:

PathPurpose
data/agent.dbAuth session + offline activity queue
data/agent.pidPID of the running worker
data/agent.disabledPresence means tracking is intentionally stopped
data/gnome-shell-restartedMarker so GNOME Shell is restarted at most once for helper setup
logs/agent.logWorker logs (start/stop, sync warnings, tracker errors)

On Linux KDE, the KWin helper may also write:

PathPurpose
$XDG_RUNTIME_DIR/analog-waketime-focused.jsonLast 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 in data/agent.db until synced or until you delete that database.