github ActivityWatch/activitywatch v0.14.1

4 hours ago

These are the release notes for ActivityWatch version v0.14.1.

New to ActivityWatch? Check out the website and the README.

Installation

See the getting started guide in the documentation.

Downloads

Classic distribution

Tauri distribution (experimental — native Wayland support on Linux)

Support ActivityWatch

ActivityWatch is free and open source, with no feature gates. If it is useful to you, AW Pro is an optional subscription that funds ongoing development.

Contributors

Thanks to everyone who contributed to this release:

@0xbrayo, @AbdulGoodLooks, @ErikBjare, @Gabriel-Dalton, @kvnloo, @TimeToBuildBob

Changelog

Changes since v0.14.0:

📦 activitywatch

✨ Features (3)

  • feat(research): ship an optional geography-free category preset (#1474) (21142d0)
  • feat(scripts): automated screenshots with realistic demo data (#1500) (bbcc9b8)
  • feat(changelog): add a Support ActivityWatch section to bundle release notes (#1486) (45ae1c8)

🐛 Fixes (7)

Click to expand

  • fix(release): don't bundle libwayland into the Tauri AppImage, and gate it (#1509) (2251b6e)
  • fix(build): drop stale Tauri bundles, and stop packaging from failing silently (#1512) (df22b2e)
  • fix(package): Linux Tauri zip: drop move-to-aw-modules.sh and the loose awatcher, rewrite README (#1508) (ed54fd7)
  • fix(make): use pip's freeze format in the uninstall target (#1505) (017d703)
  • fix(linux): stop bundling host-ABI libraries in the Qt bundle (#1484) (0ef9191)
  • fix(changelog): use /commits/<tip> when submodule is new to the release (#1504) (81885e2)
  • fix(changelog): use /commits/<tip> when submodule is new to the release (#1496) (d02cc21)

🔨 Misc (6)

  • chore: migrate issue templates to issue forms (#1482) (0c4c185)
  • docs(contributing): remove the dead GitPOAP section (#1513) (6a00b79)
  • docs(citation): update to v0.14.0 and 2026 (#1514) (94eceed)
  • test(query-parity): assert the startup poll actually retried (#1472) (17d0088)
  • docs(readme): repair release workflow badge URL (#1489) (46c8ca8)
  • docs(readme): v0.14.0 screenshots (#1501) (97db8ff)

(excluded 10 less relevant commits)

📦 aw-server

✨ Features (1)

  • feat(auth): optional API key authentication, matching aw-server-rust (#182) (fc2f28c)

🐛 Fixes (5)

  • fix(api): invalidate the heartbeat cache when events are inserted (#178) (384b122)
  • fix(import): return descriptive error messages and roll back failed imports (#176) (72e3007)
  • fix(api): replace the merged heartbeat event by id, not the latest by timestamp (#177) (ce55bbd)
  • fix(rest): return 400 instead of 500 for malformed client input (#175) (5e3c0de)
  • fix(api): keep created and data when creating a bucket over REST (#180) (4851fea)

🔨 Misc (1)

  • test(import): undo monkeypatches before cleanup deletes buckets (#186) (511639b)

(excluded 2 less relevant commits)

📦 aw-server-rust

🐛 Fixes (16)

Click to expand

  • fix(android): open the JNI datastore exactly once (#801) (faeded2)
  • fix(query-cache): charge timestamps-only in key weight, not query text (#799) (4c1cda9)
  • fix(aw-server): dedup re-imports against the privacy-filtered form of events (#768) (9793c91)
  • fix(datastore): infer schema version when a restored DB has user_version 0 (#776) (96f4113)
  • fix(export): prefix CSV data keys that collide with id/timestamp/duration (#795) (344f476)
  • fix(dirs): restore %LOCALAPPDATA% on Windows, migrate v0.14.0 Roaming data, pin paths (#791) (dc01d74)
  • fix(server): warn at startup when the web UI has no index.html (#794) (d059a4c)
  • fix(aw-server): re-importing an updated export replaces events in place (#766) (bb7f769)
  • fix(query): remove duplicate clippy allow attributes on parser module (#779) (22a77dc)
  • fix(datastore): commit stopwatch changes before acknowledging (#743) (fe0dfce)
  • fix(aw-server): return JSON errors with a reason for 400/404/422 under /api (#772) (fcc1ede)
  • fix(datastore): log why legacy import was skipped, add explicit --import-legacy (#780) (692fa0a)
  • fix(aw-sync): warn on orphaned 2-level staging db in aw-sync status (#788) (0078d8d)
  • fix(server): explain missing web UI instead of a bare 404 on / (#777) (a6d7730)
  • fix(datastore): make v3→v4 key_value migration idempotent (#792) (d5d848b)
  • fix(endpoints): reject events with negative duration and heartbeats with negative pulsetime (#785) (acbb3ee)

🔨 Misc (2)

  • test(aw-client-rust): read wait_for_start mock connections concurrently (#783) (3ebca20)
  • chore(transform): deprecate chunk_events_by_key (#758) (bec71d5)

(excluded 3 less relevant commits)

📦 aw-webui

✨ Features (5)

  • feat(categories): add 'Add on top of mine' option to import dialog (#1071) (f76e1e2)
  • feat(bucket): show most recent events when the selected range is empty (#1030) (47377e5)
  • feat(categories): layer category sets, and stop dropping edits made while layered (#1027) (fabdeab)
  • feat(categories): softer default palette without breaking stored defaults (#1065) (9bda65d)
  • feat(settings): add enabled toggle to notifications panel (Phase 3.1) (#1057) (1a9f221)

🐛 Fixes (35)

Click to expand

  • fix(queries): match Helium in the chrome bucket when no dedicated bucket exists (#989) (3b1c444)
  • fix: recover category builder loading on Android (#992) (df9d85d)
  • fix(work-report): tidy action buttons and dates on narrow screens (#1041) (2a5e91e)
  • fix(buckets): keep row actions inside the card on phones (#1087) (952c697)
  • fix: snap period-start URL dates; fix Trends chart height and x-axis labels (#1059) (af9d80b)
  • fix(timespiral): scale spiral to fit narrow screens (#1036) (65b15e3)
  • fix(queries): unescape browser regex backslashes after JSON.stringify (fixes Arc.exe on Windows) (#1084) (c8b46d6)
  • fix(settings): keep the uncategorized-hint toggle beside its heading (#1047) (69da8e8)
  • fix(sunburst): keep category sunburst labels inside the chart box (#1040) (226d1e0)
  • fix(bucket): reload events when navigating to another bucket (#1044) (d2b4890)
  • fix(work-report): count sessions using the break time (#1046) (5875847)
  • fix(graph): draw category graph at container width and label nodes (#1042) (239cf0a)
  • fix(trends): stop category table from overflowing on narrow screens (#1038) (919c936)
  • fix(views): replace stored desktop defaults with Android views on Android (#1088) (6ce8a8c)
  • fix(categories): persist layered category renames and deletions (#1072) (0755d1f)
  • fix(activity): show browser data on Android when only aw-watcher-web is present (#1069) (bdbbc39)
  • fix(activity): align week/month/year periods to their start (#1045) (ac2c277)
  • fix(sunburst): fit category labels to their ring instead of clipping them (#1064) (db18bbc)
  • fix(queries): use real bucket ids for synced hosts in single-host views (#1068) (6812979)
  • fix(work-report): name hosts by bucket hostname and query their real bucket ids (#1067) (9c441bd)
  • fix(ui): color Top Applications by each app's dominant category (#1063) (8493914)
  • fix(ui): dismissable multi-device note; drop synthetic category tag from search results (#1062) (58abaf4)
  • fix(build): honour --os=android under ESM config (#1061) (34cdfb3)
  • fix(timeline): consistent row labels for synced buckets; fix dark theme stripes (#1060) (6a182d4)
  • fix(dark-mode): set color-scheme: normal on iframes for custom visualizations (#1050) (e2cc882)
  • fix(categorization): persist Category Builder ignored words across reloads (#1031) (7d2efba)
  • fix(activity): explain why 'Time active' differs from period bar totals (#1029) (83605b0)
  • fix(categories): don't throw when the edit modal is destroyed before its deferred hide (#1028) (89a8fdd)
  • fix(categories): treat blank regex rules as matching nothing everywhere (#1026) (4e8789c)
  • fix(hosts): keep the 'unknown' pseudo-host out of device pickers (#1023) (822c8c0)
  • fix(bucket): show event count and a not-found state for unknown buckets (#1022) (64a6036)
  • fix(timeline): clamp hourly bar stacks to 1h (fixes y-axis > 1h) (#1021) (dada6c7)
  • fix(dark-mode): restore appsummary bar-chart label contrast (#1002) (9092392)
  • fix(sunburst): resolve 'auto' theme for the root circle color (#1020) (49f21f0)
  • fix(bucket): show the event count again; hide empty bucket data (#1054) (95cd6b4)

🔨 Misc (1)

  • test(activity): add store-level tests for query_browser_only action (#1070) (7250113)

(excluded 5 less relevant commits)

📦 aw-watcher-window

🐛 Fixes (5)

  • fix(logging): dedup and back off repeating poll exceptions (#157) (c8814e4)
  • fix(config): normalize scalar title exclusion patterns (#158) (f825398)
  • fix(linux): actionable Wayland warning and X auth error with backoff (#155) (02f2607)
  • fix(research): classify Gecko browsers whose URL the macOS helper captures (#153) (8e4d5a5)
  • fix(macos): don't relaunch a browser that quit while frontmost (#152) (650c925)

📦 aw-watcher-input

✨ Features (1)

  • feat: add --host and --port options (#40) (932dab4)

📦 aw-qt

✨ Features (1)

  • feat(tray): persist module start/stop to autostart_modules (#138) (54a9135)

🐛 Fixes (1)

  • fix(autostart): detect system-wide XDG entries; use $APPIMAGE for AppImage path (#137) (ed543a9)

📦 aw-tauri

✨ Features (1)

  • feat(notify): read aw-notify.enabled at startup, add tray toggle (203edaf)

🐛 Fixes (10)

Click to expand

  • fix(tray): persist module start/stop to [autostart] modules (#285) (9460d90)
  • fix(dirs): keep install-relative discovery paths out of the persisted defaults (#283) (d1796e4)
  • fix(windows): prefer bundled watchers over a stale classic install (#284) (8b26b48)
  • fix(linux): disable WebKit DMA-BUF renderer when running from the AppImage (#286) (e628a69)
  • fix(dirs): restore %LOCALAPPDATA% on Windows, migrate v0.14.0 Roaming data, pin paths, run tests in CI (#280) (ce173c5)
  • fix(autostart): treat OS as authoritative after first run; remove legacy macOS LaunchAgent (#279) (aa31d01)
  • fix(notify): match test fixture PID to stopped_module calls (8e87c68)
  • fix(notify): validate PID in stopped_module to prevent stale-stop clobber (0c675e0)
  • fix(notify): force stopped state on re-enable; use aw_config.port in GUI mode (98c036d)
  • fix(notify): address 4 P1 Greptile findings — write-failure gate, mini/daemon opt-in, stop-in-backoff, re-enable race (e6dcd93)

(excluded 4 less relevant commits)

📦 aw-notify

🐛 Fixes (1)

  • fix: treat empty always_active_pattern as unset (6694ffd)

🔨 Misc (1)

  • Fix repo URL in README install instructions (e64a4c6)

📦 aw-core

✨ Features (1)

  • feat(transform)!: match aw-server-rust's merge_events_by_keys, split_url_events and tag (#173) (29e62df)

🐛 Fixes (2)

  • fix(transform): serialize IPv6 hosts like the URL Standard on every Python (#179) (c571370)
  • fix(classify): do not crash on invalid user-supplied regex (carry of #148) (#176) (429def4)

🔨 Misc (1)

  • test(dirs): pin default directory and peewee DB paths per platform (#178) (5d34ffe)

📦 aw-client

🐛 Fixes (2)

  • fix(queue): retry queued requests on transient errors instead of dropping them (#130) (94717f0)
  • fix(client): bypass env proxies for loopback server addresses (#126) (f880a71)

🔨 Misc (3)

  • Add wait_for_queue_empty to RequestQueue/client (carry of #114, fixes #24) (#125) (58ca367)
  • Catch OSError when persisting heartbeat to queue (carry of #113) (#124) (343c52e)
  • test(queries): pin escape_doublequote actually escapes quotes (#123) (63ca86c)

Full Changelog: v0.14.0...v0.14.1

Don't miss a new activitywatch release

NewReleases is sending notifications on new releases.