These are the release notes for ActivityWatch version v0.14.2.
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)
- Windows (.exe installer)
- macOS: Intel | Apple Silicon (.dmg)
- Linux: .AppImage | .zip
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, @andreivince, @ErikBjare, @fanxing11, @kvnloo, @RaoufGhrissi, @TimeToBuildBob, @Yarish652, @zachsplat
Changelog
Changes since v0.14.1:
π¦ activitywatch
β¨ Features (1)
π Fixes (5)
- fix(release): harvest signed Linux deb/rpm updater artifacts (#1542) (
b4b3bd3) - fix(release): pass bundle version to the Tauri compilation (#1535) (
71cdc78) - fix(packaging): pin Qt Wayland watcher substitution (#1532) (
5f54ca2) - fix(issue-forms): remove invalid empty title keys (#1524) (
33f667d) - fix(package): don't trust uname -m for Windows zip arch (#1520) (
e0d283f)
π¨ Misc (2)
- docs(readme): link AW Pro support with attribution; drop stale budget badge (#1543) (
0d114d7) - docs(README): update architecture diagram (
34c7e61)
(excluded 13 less relevant commits)
π¦ aw-server
β¨ Features (1)
π Fixes (8)
Click to expand
- fix(api): reject nonfinite heartbeat pulse windows (#207) (
7af1920) - fix(export): serialize WSGI-safe attachment filenames (#212) (
b298f74) - fix(export): prefix CSV data keys that collide with id/timestamp/duration (#184) (
c1ea4ee) - fix(settings): preserve saved state on persistence errors (#198) (
05bc762) - fix(config): use [server] in isolated profile roots (#170) (
991fa6e) - fix(ci): drop brittle PAT-based dependabot automerge (#196) (
be99fec) - fix(storage): close request database connections (#171) (
6356feb) - fix(http): accept IPv6 loopback Host headers (#172) (
f8a352c)
(excluded 17 less relevant commits)
π¦ aw-server-rust
β¨ Features (7)
- feat(transform): add merge_subwatcher_fields query function (#824) (
1d101d4) - feat(aw-sync): status --clean-legacy prunes re-exported buckets from own staging (#723) (
b1d7976) - feat(aw-sync): add Android JNI resetStaging for own-device staging db (#815) (
82995ea) - feat(android): add setSetting JNI binding (#816) (
919cbff) - feat(server): bulk event delete endpoint (#781) (
ce65045) - feat(server): serve query reads from a read-only datastore handle (#807) (
af70e58) - feat(query): per-request time budget and slow-query logging (#806) (
6f4204f)
π Fixes (15)
Click to expand
- fix(transform): parse scheme-less Android browser domains (#852) (
67432e6) - fix(datastore): invalidate heartbeat cache on delete and rename (#826) (
fe353a6) - fix(android): invalidate the query cache on JNI writes (#831) (
92631a3) - fix(transform): sort union_no_overlap inputs by timestamp (#838) (
c684083) - fix(datastore): update JSON settings fields atomically (#834) (
cfccd10) - fix(query): parse negative number literals in the query language (#832) (
c58b49d) - fix(sync): migrate staging database name (#800) (
69e0ac4) - fix(server): make bucket_list_changed non-blocking β drop reader.reload_buckets() (#821) (
9bedc57) - fix(android): let /api/0/info report the device hostname (#823) (
db85090) - fix(legacy-import): propagate insert_events/create_bucket errors instead of panicking (#822) (
c883054) - fix(recovery): restart-safe union of Windows Local and Roaming histories (#813) (
fe558c4) - fix(datastore): detect a corrupt database at startup, checkpoint WAL on close (#778) (
4f955b0) - fix(aw-server): detect if ActivityWatch is already running on AddrInUse (#773) (
efad1f0) - fix(android): force-commit setSetting before reporting ok (#817) (
d0f5074) - fix(query_cache): bound pending_flush to write_log_size, skip when no reader (#818) (
84a26e1)
π¨ Misc (3)
- test(client): fix Windows CI flake in test_wait_for_start_retries_without_blocking_executor (#819) (
6de27c9) - test(sync): pin PeerReport visibility contract for record_peers=true (#787) (
ccf07c5) - test(server): verify stopwatch acknowledgements survive process restart (#814) (
18fb62e)
(excluded 18 less relevant commits)
π¦ aw-webui
β¨ Features (30)
- feat(i18n): explain translation quality and invite native-speaker corrections (#1163) (
c933686) - feat(trends): group the time chart by day or week (#1194) (
1805832) - feat(activity): per-device active time in the multi-device view (#1170) (
a226d13) - feat(categories): carry common app defaults from #495 (#1166) (
283305e) - feat(timeline): group consecutive short events into expandable composites (#1181) (
d7f874b) - feat(activity): select exact sub-day intervals (#1168) (
dba35d3) - feat(trends): filter category history and comparisons (#1182) (
519c6ff) - feat(home): tag Android subscribe CTA as inapp-home-android (#1185) (
1f56021) - feat(i18n): add Indonesian (id) locale (#1155) (
d7d45cd) - feat(i18n): add Swahili (sw) locale (#1158) (
86178ef) - feat(i18n): add Bengali (bn) locale (#1156) (
244e7ec) - feat(i18n): add Urdu (ur) locale with RTL direction (#1157) (
360dd13) - feat(i18n): add Brazilian Portuguese (pt-BR) locale (#1150) (
fb8e824) - feat(i18n): add French (fr) locale (#1149) (
efcfbcc) - feat(i18n): add Japanese (ja) locale (#1154) (
f3c86db) - feat(i18n): add Hindi (hi) locale (#1151) (
db9e22d) - feat(i18n): add Arabic (ar) locale with rtl document direction (#1152) (
b1541fd) - feat(i18n): localize remaining screens in Simplified Chinese (#1147) (
78ad8ce) - feat(i18n): add Spanish (es) locale (#1145) (
f54fa2f) - feat(i18n): complete uk/de/ru/sv/zh-CN coverage and report translation % per locale (#1143) (
001921b) - feat(i18n): complete Simplified Chinese UI coverage (#1134) (
ac8a180) - feat(activity): show banner when core watcher bucket is stale (#1083) (
a3559fa) - feat(timeline): add merged final-category row (#1129) (
8557c08) - feat(timeline): add date shift buttons and preserve query params on period nav (#1128) (
7e3347f) - feat(search): include browser URL/title results alongside window events (#1025) (
d678505) - feat(android): blend browser URL data when aw-watcher-web is present (#1091) (
65ac42e) - feat(nav): add Category Builder to the tools menu as a standalone page (#1117) (
195d168) - feat(nav): add Category Builder to the tools menu as a standalone page (#1114) (
49d2091) - feat(buckets): list buckets as rows instead of a button table (#1092) (
375c135) - feat(ui): open phone navigation in a side drawer (#1102) (
e11ddab)
π Fixes (66)
Click to expand
- fix(report): export successful calculation inputs with results (#1257) (
d6d1f21) - fix(transforms): enumerate every overlapping pair (#1144) (
50f6b74) - fix(sunburst): align reporting-day arcs with wall-clock ticks (#1240) (
5c6b36f) - fix(settings): keep the confirmed privacy-filter baseline when a save fails (#1136) (
4c85178) - fix(time): preserve relative intervals and validate inclusive range bounds (#1204) (
6b69113) - fix(bucket): bind merge inputs to current selection loads (#1211) (
c3a1f26) - fix(query): bind preset confirmations to invocation snapshots (#1218) (
bbf2fe5) - fix(reports): anchor query windows to the configured logical day (#1201) (
e174ede) - fix(graph): preserve structural category identities (#1219) (
3b898d8) - fix(categories): preserve structural hierarchy and tree expansion (#1220) (
3ebeadc) - fix(buckets): retry only pending confirmed host deletions (#1212) (
16aff47) - fix(categories): preserve structural paths through category selectors (#1226) (
3f8e326) - fix(categories): preserve complete paths during enumeration (#1232) (
f39df23) - fix(ai-summary): bind activity and inference to one invocation (#1237) (
fa2faee) - fix(views): isolate layout drafts and await confirmed saves (#1222) (
4176400) - fix(categories): avoid empty alternative when appending first pattern (#1230) (
2213244) - fix(top-bucket): preserve typed value identity in grouping (#1242) (
82f6ef6) - fix(categories): acknowledge only the saved category snapshot (#1228) (
2fc61ef) - fix(settings): persist only intentionally updated keys (#1223) (
ab82878) - fix(categories): reject malformed imports before live mutation (#1239) (
fd1c979) - fix(alerts): preserve category paths and compare goal units (#1216) (
034c919) - fix(top-bucket): keep async results owned by the latest load (#1234) (
c9e4cee) - fix(ai-summary): aggregate literal application and domain keys (#1238) (
68ac353) - fix(summary): redraw when the selected data key changes (#1245) (
ab97aa7) - fix(graph): keep Generate results owned by the current invocation (#1248) (
e2f3fa7) - fix(editor): bind drafts and mutations to selection identity (#1208) (
abbd592) - fix(bucket): reconcile confirmed event deletions (#1207) (
4b58484) - fix(reports): bind chart data to the successful report query (#1205) (
c3a1014) - fix(buckets): keep import status owned by the current selection (#1210) (
4fe9d20) - fix(query): keep results owned by the latest submission (#1217) (
bfc798b) - fix(notifications): persist preferences and backoff explicitly (#1224) (
18c276d) - fix(search): keep results owned by latest submission (#1206) (
5c50b93) - fix(ci): reject failed screenshot publication (#1236) (
de58c19) - fix(activity): open per-device breakdown as floating popover (#1197) (
0b73e83) - fix(categories): match default Kate alternative as a whole field (#1184) (
628a447) - fix(sunburst): use configured category colors for window arcs (#1183) (
d9a3386) - fix(export): neutralize spreadsheet formulas in client-side CSV exports (#1192) (
a3f9ed5) - fix(ai-summary): count app changes independently of idle gaps (#1180) (
8d662f8) - fix(color): read the saved color-fallback setting from the store (#1139) (
3caf486) - fix(transforms): detect interval containment in overlappingEvents (#1138) (
ca94fad) - fix(i18n): complete coverage for de, es, ru, sv, uk locales (#1177) (
8ba9a2d) - fix(test): bound Jest's default worker pool (#1159) (
bc41bd7) - fix(activity): cover DST days with matching hourly queries and labels (#1133) (
91c994e) - fix(activity): explain missing activity data (#1024) (
7924253) - fix(reports): honor configured calendar week start (#1148) (
9141d06) - fix(event-list): wrap event fields on phones (#1039) (
fc3cc08) - fix(reports): zero seconds in configured day boundaries (#1141) (
246cb87) - fix(trends): keep only the latest refresh's results (#1142) (
8124a6e) - fix(trends): slice day windows at the configured start of day (#1140) (
8e8e14a) - fix(timeline): AFK-filter the Categorized row by default (#1135) (
a9cde32) - fix(stopwatch): find old running timers and page through history (#1130) (
d97a72f) - fix(timeline): keep tooltip labels from being squeezed by long values (#1048) (
7b95d87) - fix(categories): preserve explicit numeric zero scores (#1132) (
0b0d0b4) - fix(timeline): refresh events after editing (#1082) (
25b7a41) - fix(ui): replace native confirm() with b-modal msgBoxConfirm (#1112) (
76dac82) - fix(top-bucket-data): cover the selected bucket's own history in All time (#1079) (
25286f9) - fix(buckets): stop later cards covering the unknown host's dropdowns (#1110) (
a362ff4) - fix(queries): match ungoogled-chromium in the chrome app-name pattern (#1124) (
1fb9c99) - fix(ci): run e2e on Chrome for Testing stable instead of the runner's Chrome (#1126) (
13a4625) - fix(ci): bound stalled TestCafe steps to ten minutes (#1120) (
5475b0e) - fix(activityContext): use formatToParts for locale-independent YYYY-MM-DD dates (#1115) (
ddf5f79) - fix(settings): keep developer-settings toggles beside their headings (#1108) (
aac7ecd) - fix(periodusage): cast e.target to Element for getAttribute (#1095) (#1111) (
8f76cf5) - fix(settings): give the active-pattern input the full width (#1109) (
651a40f) - fix(categories): reject negative rule priority (#1101) (
8a295fd) - fix(activity): build the Year barchart from day chunks and show progress for every chunked load (#1098) (
655a00a)
π¨ Misc (9)
Click to expand
- test(graph): align invocation assertions with structural identities (#1255) (
268b4ab) - refactor(i18n): one sorted endonym map instead of a copy in every locale file (#1164) (
da1c9bb) - refactor(i18n): sort locale registrations alphabetically to prevent cascade conflicts (#1161) (
63ced66) - refactor: convert remaining application JavaScript to TypeScript (#943) (
de2bc86) - Resolve outstanding webui TODO/FIXME markers (#979) (
b72413f) - perf(timeline): render only items near the viewport (#1086) (
8e8e807) - chore(deps): remove unused uuid direct dependency (#1127) (
d6e9d70) - test(e2e): add dark-mode and mobile screenshot matrix (#1105) (
05f5bc2) - test(queries): fix stale double-escaping in the Helium chrome-fork tests (
5e3daa4)
(excluded 14 less relevant commits)
π¦ aw-watcher-afk
β¨ Features (1)
π Fixes (2)
- fix(afk): anchor steady-state not-afk heartbeats after not_afk_start (#91) (
fe882b6) - fix(afk): keep recording while the server starts (#93) (
2762612)
π¦ aw-watcher-window
β¨ Features (2)
- feat(privacy): add watcher-side privacy filter (drop/redact before send) (#135) (
d5b9c9c) - feat(config): add exclude_apps option to suppress logging for matched apps (#156) (
1d07782)
π Fixes (9)
Click to expand
- fix(macos): keep foreground tracking when browser context fails (#146) (
12000f5) - fix(ci): pin Linux Python 3.9 jobs to Ubuntu 24.04 (#174) (
25d8940) - fix(macos): start the Swift helper after all globals are initialized (#172) (
86c5203) - fix(linux): match Mutter Xauthority records at the safe xlib pin (#169) (
70e23b9) - fix(config): let --exclude-titles and --exclude-apps be repeated (#173) (
b376ad9) - fix(windows): report the real app for UWP windows instead of Applicat⦠(#167) (
ad9f193) - fix(macos): keep JXA tracking when an app has no scriptable window (#168) (
10638b2) - fix(main): don't exit when aw-server starts slowly at boot (#164) (
e275219) - fix(macos): serialize heartbeats through a retrying queue, create the bucket lazily (#162) (
6d58cef)
π¨ Misc (1)
(excluded 2 less relevant commits)
π¦ aw-watcher-input
β¨ Features (1)
π Fixes (1)
π¦ aw-qt
β¨ Features (4)
- feat(tray): add an attributed "Support ActivityWatch" menu item (#147) (
9f66797) - feat(wayland): accept aw-awatcher as the Wayland watcher (#143) (
5fb7634) - feat(wayland): auto-detect Wayland session and start aw-watcher-window-wayland (#142) (
b0b405c) - feat: opt-in aw-notify β start only when aw-notify.enabled is true, plus tray toggle (#134) (
e00fbcf)
π Fixes (4)
- fix(manager): find Rust module logs on Windows for the crash dialog (#146) (
6a5d322) - fix(manager): start aw-sync only after the server answers (#145) (
bbccb71) - fix(tray): report failed Linux folder launches (#141) (
6a33293) - fix(tray): don't auto-restart modules that exited cleanly (#140) (
fa16bf8)
(excluded 2 less relevant commits)
π¦ aw-tauri
β¨ Features (2)
- feat(tray): add an attributed Support ActivityWatch item (#303) (
689b0db) - feat(dashboard): enable native zoom shortcuts (#301) (
b1b8c34)
π Fixes (4)
- fix(config): preserve control characters in TOML rewrites (#298) (
d3b5527) - fix(autostart): refresh a stale autostart path and explain the second-instance exit (#297) (
3c17a4f) - fix(notify): reuse the server datastore for settings (#302) (
c2f06a2) - fix(export): keep blob downloads native and save backups to Downloads (#294) (
e4c7d7b)
(excluded 5 less relevant commits)
π¦ aw-notify
π Fixes (1)
π¦ aw-core
π Fixes (8)
Click to expand
- fix(transform): parse scheme-less Android browser domains (#200) (
14dd37c) - fix(query): report invalid custom filter regex as query errors (#193) (
e919457) - fix(query): validate required arguments before type inspection (#189) (
39b1bf3) - fix(query): accept whitespace-only empty collections (#187) (
919d82f) - fix(query): reject truncated dictionary keys as parse errors (#191) (
adef26b) - fix(query): accept negative integer literals in Python queries (#198) (
1dcab4c) - fix(transform): handle zero-duration base and sub events in merge_subwatcher_fields (#141) (
c782189) - fix(transform): sort union_no_overlap inputs by timestamp (#185) (
4f5df9d)
π¨ Misc (1)
π¦ aw-client
β¨ Features (2)
- feat(client): support configured HTTPS base URLs (carry of #74) (#137) (
c88cf12) - feat(client): add delete_events for bulk event deletion (#134) (
f024e34)
π Fixes (12)
Click to expand
- fix(cli): resolve categories through the selected instance (#160) (
6cc2986) - fix(cli): preserve aware query bounds with explicit timezone (#147) (
eac48cd) - fix(examples): clip time spent today to local calendar bounds (#164) (
297b822) - fix(examples): preserve local workday boundaries across DST (#163) (
00598f8) - fix(examples): copy merge_buckets events without source IDs (#149) (
6ef3f6e) - fix(report): compute totals from uncapped active duration (#162) (
35e1423) - fix(cli): expose report and canonical cache query names (#158) (
a62317c) - fix(cli): render non-event AQL results without mutating events (#145) (
3abac4c) - fix(queries): preserve fullDesktopQuery caller parameters (#143) (
fe8b821) - fix(queries): preserve Unicode categories in generated AQL (#161) (
b0df1bc) - fix(client): make wait_for_start() respect its timeout (#136) (
a702e89) - fix(client): return None from get_event on 404 (#135) (
fe10696)
π¨ Misc (1)
(excluded 3 less relevant commits)
Full Changelog: v0.14.1...v0.14.2