v0.14.0
These are the release notes for ActivityWatch for Android version v0.14.0.
Contributors
Thanks to everyone who contributed to this release:
@0xbrayo, @2e3s, @750, @almirb, @BelKed, @brayo-pip, @cosine0, @davidfraser, @deancureton, @Elijah-Bodden, @ErikBjare, @fanxing11, @iloveitaly, @istudyatuni, @jkbh, @johan-bjareholt, @kenoma-hld, @Lorite, @matt-seb-ho, @musicinmybrain, @nathanmerrill, @nerumo, @NickWick13, @Noorts, @Organoidus, @pkvach, @RTnhN, @Senophyx, @skaparis, @TiberiusNemesis, @TimeToBuildBob, @vieteh
Changelog
Changes since v0.12.1:
📦 aw-android
✨ Features (30)
- feat(sync): show last completion status (#251) (
5b2449a) - feat(widget): add picker preview and document NotifyWorker rollup (#234) (
fa0fd58) - feat: add Material You monochrome launcher icon (#230) (
375b851) - feat(sync): bridge SAF-granted URI to aw-sync output (Phase 2) (#209) (
d9802dd) - feat(sync): add SyncSettingsActivity — enable/disable toggle + SAF directory picker (#204) (
41d5b5a) - feat(notify): read alert config from server settings, fall back to defaults (#202) (
348a0a3) - feat(notify): add aw-notify support — activity-time threshold alerts (#199) (
26dcfb5) - feat: add POST_NOTIFICATIONS permission and runtime request (#195) (
3144444) - feat(auth): bootstrap android dashboard token (#157) (
6afd735) - feat(watcher): multi-browser WebWatcher with Firefox Compose toolbar support (#187) (
3e719ed) - feat(sync): disable automatic sync by default (#184) (
812c25c) - feat: migrate legacy db hostnames (
1c05168) - feat: unlock watcher (
cc4d966) - feat: update widget every 5 mins (
a6a50bf) - feat: update widget every 15 mins (
3f37a4e) - feat: bump ci versions (
e92ad7e) - feat: media watcher (
0ad7232) - feat: add widget refresh animation (
778cca4) - feat: implement widget background worker (
fee7803) - feat: enhance widget with visual indicators (
e8a412c) - feat: implement category time widget (
d5b2ecb) - feat: add sync support methods to RustInterface (
5362608) - feat: experimental parsing of events in background (
b96d64a) - feat: always active in the background (
f1c4667) - feat: implemented generic web watcher with support of multiple web browsers (
54f95b2) - feat(android): implement automatic background sync (
b34bb0c) - feat(android): add SyncInterface.kt with JNI bindings for aw-sync (
dac00fb) - feat:use device name as hostname (
c77dbbc) - feat(release): auto-set versionName from tag on release builds (#168) (
1ca0268) - feat(auth): add API key settings screen (#156) (
ef703ce)
🐛 Fixes (100)
Click to expand
- fix(notify): accept canonical shared config schema (#246) (
b908428) - fix(sync): pick up aw-server-rust API-key JNI client and set data dir (#249) (
e5ff57f) - fix(android): open Activity view with device hostname, not unknown (#250) (
86a712e) - fix(notify): open the activity view when an alert is tapped (#242) (
4eb6391) - fix(android): migrate aw-watcher-android-test buckets on startup (#244) (
cc0e368) - fix(webview): open a document picker for untyped file inputs (#248) (
cd6d448) - fix(android): report the app's version from /api/0/info (#240) (
835b8bf) - fix(android): load background settings from datastore (#237) (
23d1fc4) - fix(widget): revert category grouping to top-level (#233) (
8c50bc8) - fix(notify): restore notification text from PR #223 while keeping icon fix from PR #227 (#232) (
af809af) - fix: save bucket exports from the WebView instead of dropping them (#229) (
ed15dae) - fix(sync): make Sync Settings reachable from the navigation drawer (#221) (
85a98cc) - fix(notify): open MainActivity when notification is tapped (#225) (
dddc5e6) - fix(sync): make the SAF mirror recursive and structure-preserving (#222) (
928814f) - fix(notify): use ActivityWatch logo as notification small icon (#227) (
9738e73) - fix(widget): group category time by full path, matching the Activity view (#231) (
8a0d697) - fix: reword foreground notification to not expose internals (#223) (
9088923) - fix(release): cap Play Store changelog at 500 characters (#219) (
4c220f4) - fix: add prominent disclosure before accessibility settings redirect (#215) (
63d8716) - fix: replace Material attrs with AppCompat in settings activities (#211) (
4f93433) - fix(widget): match Activity view startOfDay and add open-app button (#198) (
1bd18cc) - fix(notify): trim DEFAULT_ALERTS to 2-3 thresholds per category (#206) (
4a8fa57) - fix(fastlane): add changelog 36.txt and auto-generate changelogs in CI (#194) (
2dd4d52) - fix(auth): call ensureDashboardApiKey in BackgroundService.onStartCommand (#192) (
8eaebd7) - fix(auth): persist auth-disabled setting across restarts (#193) (
a28b9d7) - fix: remove FOREGROUND_SERVICE_DATA_SYNC permission (unblocks v0.14.0 Play Store upload) (#190) (
920e35e) - fix: CSV/JSON export via WebAppInterface + FileProvider (fixes #104) (#186) (
49d9363) - fix: use Build.DEVICE instead of Build.MODEL for hostname fallback (#183) (
39e840f) - fix(ci): use version regex for SUPPLY_TRACK instead of semver is_stable (#182) (
b6ccf63) - fix(ci): add rubygems.org source before fastlane release step (#180) (
16b61ce) - fix: revert "chore: replace the default android.jks.age" (#175) (
caf8365) - fix(migration): handle plain-text success response from migrateHostname JNI (#172) (
62b8670) - fix(ci): validate all jniLibs ABIs and exclude armeabi-v7a from debug builds (#173) (
5d34795) - fix(activity): skip main startup during onboarding (
584c002) - fix(web): guard WebWatcher bucket initialization (
510665b) - fix(media): handle bucket init failures (
0458ff8) - fix(ci): call startForeground() before native init to avoid 5s ANR (
c996d12) - fix(service): call startForeground() in onCreate() to avoid 5s OS timeout (
096ad26) - fix(ci): avoid multi-line shell construct in e2e runner script (
980e1d8) - fix(ci): keep e2e runner script in one shell (
4e4465d) - fix(ci): stabilize aw-android web watcher e2e (
c19c92d) - fix: move MediaWatcher bucket init off main thread; recycle WebWatcher node (
ad935df) - fix: restore SCHEDULE_EXACT_ALARM permission for widget updates (
af2a3be) - fix: handle alarm errors and test JNI artifact restore (
5ae06e6) - fix: prevent overlapping-session double-count in SessionParser (
8114118) - fix: drop unused SCHEDULE_EXACT_ALARM permission (
a825e4f) - fix: use ConcurrentHashMap in MediaWatcher to prevent map-modification race (
94fdb20) - fix: remove getTodayTimeline() that called deleted getTimelineForDay() (
ac37e1b) - fix: remove bulk-import helpers with no deduplication guard (
89c1488) - fix: remove dead CategoryTimeWidgetWorker and move SyncInterface init off main thread (
3c4171d) - fix: distinguish server-down from fresh-install in EventParsingWorker guard (
d73a99a) - fix: use conservative defaults for hostname migration success detection (
6141493) - fix: remove test() debug method, clarify insertEvent KDoc, document suspend no-op (
cc56b40) - fix: guard EventParsingWorker against epoch-0 cursor reset on cold server (
37c9a17) - fix: keep AlarmManager fallback alarm alive when BackgroundService stops (
6a46f35) - fix: add lifecycle-runtime-ktx dep, move SyncInterface init off main thread, deprecate sendHeartbeats() (
8ea1334) - fix: pin all MediaWatcher callbacks to handlerThread to prevent data races (
1e14f23) - fix: parse migrateHostname result as JSON instead of string-contains (
61bd673) - fix: prevent concurrent syncBoth() JNI calls via shared AtomicBoolean (
2ce803e) - fix: move MediaWatcher polling and JNI heartbeat off main thread (
a9124a1) - fix: recycle AccessibilityNodeInfo in WebWatcher.findWebView (API 26-32 leak) (
d2a2958) - fix: restore widget periodic alarm in onUpdate (covers post-reboot case) (
7169f61) - fix: run hostname migration off main thread to avoid ANR; fix midnight calc (
fdf6943) - fix: wire AlarmManager fallback in SyncScheduler so SYNC_ALARM is reachable (
e9d7a4d) - fix: prevent concurrent syncs and unconditional hostname migration mark (
d6605c5) - fix: restore background collection for session mode via goAsync in AlarmReceiver (
76a22bd) - fix: bind session-event coroutine to Activity lifecycle; remove dual BOOT_COMPLETED (greploop final+1) (
345bcc7) - fix: prevent async work from being orphaned in SyncAlarmReceiver (greploop final) (
84e5c80) - fix: register SyncAlarmReceiver in manifest (greploop iteration 5) (
2d33ddd) - fix: pass foreground service type to startForeground on Android 14+ (greploop iteration 4) (
b46440c) - fix: prevent duplicate session insertion from concurrent callers (greploop iteration 3) (
bf1d38a) - fix: dispatch onUpdate off main thread to avoid ANR (greploop iteration 2) (
01b5633) - fix: address greptile review feedback (greploop iteration 1) (
81204d9) - fix: use KEEP policy for EventParsingWorker, remove dead widget code (
e7f8556) - fix: rename production bucket from aw-watcher-android-test to aw-watcher-android (
baa2f03) - fix(ci): skip deprecated 'tools' package in setup-android@v3 (
fa39a20) - fix(ci): use default emulator target to avoid google_apis flakiness (
e9224e5) - fix: address two greptile P1 findings (
a92262a) - fix(ci): preinstall ndk before emulator runner (
4fbccb2) - fix(sync): avoid replaying last session event (
5e78333) - fix(ci): stop masking e2e failures (
14d85c4) - fix(sync): handle missing aw-sync library (
28a5d46) - fix(ci): pass jniLibs via artifact upload/download instead of cache (
dcdec24) - fix(ci): bypass onboarding, grant usage stats perm, unlock screen before screenshot (
899466a) - fix(ci): install apk explicitly and use monkey to launch app before screenshot (
08042bc) - fix(ci): correct am start intent to use debug package + full class name (
1177a81) - fix(ci): launch app, sleep 1s, screenshot and logcat in emulator-runner script (
de60534) - fix(ci): restore missing path key and set fail-on-cache-miss: false in cache restore steps (
c178744) - fix(ci): remove fail-on-cache-miss from cache restore (
52533f5) - fix(ci): update sdkmanager, avdmanager, and emulator paths for setup-android@v3 (
0bedc25) - fix: fix doNotStrip property not working (
408c3af) - fix: fix single-instance errors on android (
607a73a) - fix: fix launch on boot not working (
36749b2) - fix(ci): upgrade android-actions/setup-android from v2 to v3 (#169) (
e9e3615) - fix: fix Rust initialize JNI return type (#167) (
edca195) - fix(release): require committed versionName for tag builds (#155) (
dbd05d1) - fix(ci): bump aw-server-rust submodule to fix time-0.3.30 compile error on Rust 1.85+ (#165) (
00b06c4) - fix(webui): keep embedded ActivityWatch URLs inside WebView (#161) (
2e9e733) - fix: remove logspam in chrome watcher (
9d32040) - fix: added check that port 5600 is not already in use (
806dc6c)
🔨 Misc (32)
Click to expand
- chore: bump versionName to 0.14.0, versionCode to 41 (
e0cad8e) - chore: bump versionName to 0.14.0b2, versionCode to 40 (
5ec992b) - chore: bump versionName to 0.14.0b1, versionCode to 39 (
a21b48c) - chore: bump versionName to 0.14.0dev202608101, versionCode to 38 (
9a7a556) - chore: bump versionName to 0.14.0dev20260810, versionCode to 38 (
9197df4) - docs(ci): cross-reference shared Android signing strategy with gptme (#207) (
f206252) - chore: bump versionName to 0.14.0dev20260723 (
749e059) - chore: bump versionName to 0.14.0dev20260722 (
8e0f9d6) - chore: bump versionName to 0.14.0dev202607121 (
6f9ca02) - chore: bump versionName to 0.14.0dev20260712 (
67b2326) - chore: bump aw-server-rust submodule (
09f59e4) - chore: bump versionName to 0.14.0 (
8ae1096) - Revert "fix(ci): avoid multi-line shell construct in e2e runner script" (
2de01f0) - refactor: dedupe bucket-id constants and guard EventParsingWorker on usage access (
7410568) - chore: linting diff (
824880c) - chore: update settings.gradle (
119ad2e) - refactor(ci): replace manual emulator setup with reactivecircus/android-emulator-runner@v2 (
ef22ce5) - refactor: simplify widget styling and worker logic (
c8b4ea0) - refactor: optimize widget layout for 4x1 size (
4c48273) - chore: update aw-server-rust submodule reference (
257e0bd) - refactor: improve RustInterface initialization (
de6e0f6) - chore: replace the default android.jks.age (
d78c637) - style: fix linting warrnings (
63c6c3e) - Update mobile/src/main/java/net/activitywatch/android/watcher/WebWatcher.kt (
fe8be7e) - chore: minimum api target bump (
bc7251e) - chore: gradle version bump and misc (
8b06a07) - refactor: refactored to improve accuracy of the timeline (
fe0a582) - docs: update deprecated magick command (
68fb439) - chore: add 'sh' to README.md (
4e6eb28) - docs: added comment about versionName and versionCode (
6671bd8) - chore: bumped versionName and versionCode to 0.12.1 (
d95ca0d) - docs(README): added Play Store ratings badge (
85bce09)
(excluded 25 less relevant commits)
📦 aw-server-rust
✨ Features (24)
- feat(classify): optional priority field for category rules (#663) (
d2e7b80) - feat(profile): named instance profiles via --profile flag (#652) (
c8533a0) - feat(server): let packaged builds override the reported version (#656) (
77defef) - feat(android): add migration for aw-watcher-android-test bucket names (#628) (
c022e85) - feat(datastore): add opt-in SQLCipher encryption support (#584) (
af324f9) - feat(server): add --config override for server config path (#601) (
c82981d) - feat(privacy-filter): add heartbeat-level privacy filtering engine (#600) (
df49b3d) - feat(client): add API key authentication support to aw-client-rust (#587) (
2875df5) - feat(server): add opt-in API key authentication via Bearer token (#585) (
7c33810) - feat(cors): add cors_regex config for custom regex-based CORS origins (#569) (
0b46e59) - feat: fetch server side categories for querying (#568) (
0d4c285) - feat: add an JNI endpoint for android querying (
0b7fd68) - feat: set max-page size to 16KB for shared objects (
f7965c7) - feat(aw-sync): pass hostname from Android to JNI for proper sync directory structure (
69afcab) - feat(aw-sync): add Android JNI support and library build (
9467c2a) - feat(sync): daemon support for advanced sync (#528) (
d40d712) - feat: add optional always-active-pattern to canonical queries (#543) (
10c50ba) - feat(client): support single instance (#522) (
f4bb94d) - feat: canonical queries (#529) (
02504a6) - feat(sync): gracefully handle SIGTERMs (#516) (
869d65e) - feat: added query function in aw-client (#477) (
c056e50) - feat: added daemon default subcommand, syncing at 5min intervals (
5dd5f34) - feat(sync): assume sync subcommand if none given (
ae8f7bf) - feat(sync): moved logic in sync-test scripts into rust, enabling sync with a single command (#430) (
3ab8291)
🐛 Fixes (48)
Click to expand
- fix(datastore): merge disjoint aw-watcher-android-test events on name collision (#661) (
8f03f04) - fix(aw-sync): forward API key on Android JNI client (#666) (
6d4fdf7) - fix(server): reject bucket creation with whitespace in client hostname (#658) (
840d11c) - fix(android): log Rust panics to logcat via android_log (#654) (
2de9533) - fix(android): load widget classes from datastore, not unauthenticated HTTP (#653) (
75722f3) - fix: resolve cargo build warnings (#619) (
ab9c848) - fix(sync): never re-sync buckets synced from another host (#648) (
d827c15) - fix(aw-sync): only write $aw.sync.origin on pull, not push-staging (#650) (
40d0c65) - fix(ci): remove brittle dependabot automerge PAT (#643) (
d030f63) - fix(query): return 400 Bad Request for query errors instead of 500 (#644) (
a422b6f) - fix(aw-sync): forward API key from server config, stop panicking on 401 (#640) (
a8bf1e4) - fix(cors): scope the moz-extension wildcard to aw-watcher-web endpoints (#637) (
45ca293) - fix(auth): API key bypass via percent-encoded paths (#636) (
8fd4e09) - fix(android): update JNI androidQuery bucket name to aw-watcher-android (#632) (
0094c14) - fix(sync): chunk event fetch in sync_one() to prevent OOM on large buckets (#631) (
d87bd93) - fix(deps): upgrade reqwest 0.11 → 0.12 to fix rustls-webpki vulnerability (#617) (
6f6c64a) - fix(ci): harden dependabot automerge workflow (#611) (
288decb) - fix(android): make compile-android.sh cwd-safe (#609) (
7812b56) - fix(android): load embedded server config (#608) (
0c8b2ad) - fix(aw-client-rust): fail on non-2xx responses (#607) (
73389bc) - fix(query): support select_keys in regex rules (#605) (
5b3f0f8) - fix(deps): bump time to 0.3.47 in Cargo.lock (#589) (
1e9c358) - fix: prevent API key auth bypass via double slashes (#588) (
4f6c565) - fix(import): merge events into existing bucket instead of failing (#575) (
0a94e0f) - fix(datastore): handle commit failures gracefully instead of panicking (#572) (
9a8802a) - fix(transform): use scheme as domain for file:// URLs (#570) (
f9faa5e) - fix(dirs): restore /log subdirectory in log path after appdirs migration (#565) (
66e2e97) - fix: replace appdirs with dirs for Windows ARM64 compatibility (#562) (
91ccf22) - fix(datastore): preserve event ID in heartbeat cache after merge (#561) (
1c2920d) - fix(aw-sync): add cdylib crate-type for JNI shared library generation (
8cdeea6) - fix(aw-sync): make get_server_port conditional for Android (
d67870f) - fix(aw-sync): make env mutable and conditionally compile config functions for Android (
ef0ad9e) - fix(aw-sync): fix type annotations and JNI reference in android.rs (
cfabb77) - fix(aw-sync): make clap import and ValueEnum derive conditional on cli feature (
dc2111a) - fix(datastore): use event ID instead of max(endtime) in replace_last_event (#555) (
7ffceb8) - fix(queries): eliminate double-escaping in regex patterns (#541) (
8289a0f) - fix(android): jstring_to_string function to properly convert Java strings (#547) (
24d3bdf) - fix(sync): added
client.wait_for_start()and improve error handling in sync daemon (#495) (a0cdef9) - fix(sync): remove bug-causing workaround for spurious small db files (fixes #466) (#492) (
5738246) - fix(linux): add sd-notify for better systemd interop (#489) (
8d7ce89) - fix: fixed compilation warnings & deprecations (#479) (
14165e1) - fix: fix for served paths in new aw-webui build config (no more /static/) (
f1f63c3) - fix: added sync dir config via global
--sync-dircli param andAW_SYNC_DIRenv var (#457) (1b56e03) - fix: replace panics with results & better option types (#437) (
dc70318) - fix: set rocket_cors log level to Warn (fixes[#975](ActivityWatch/activitywatch#975)) (
59ee035) - fix(datastore): fixed deprecations in chrono (timestamp_nanos and from_utc) (
88464b5) - fix: return null for missing settings without 404 (
d39f258) - fix: rewrote settings logic to mimic aw-server-python behavior (#428) (
728c00e)
🔨 Misc (17)
Click to expand
- various TODOs, FIXMEs (#669) (
8bb37ad) - perf(aw-transform): cache categorize results per event data to fix month-view timeout (#657) (
7429039) - test(aw-query): add property-based fuzz tests for regex compilation (#651) (
4947c03) - perf: cache compiled regex in categorization rules (#634) (
d350f42) - aw-sync: add --mode to daemon, fix unrespected --start-date (#620) (
9e771ef) - chore: bump webui submodule (
c665f2d) - perf(datastore): enable WAL journal mode (#616) (
d7349c2) - Performance improvements (#615) (
73ae710) - chore: bump aw-server-rust version to v0.14.0 (
826efce) - fix(aw-sync): use passed hostname directly instead of client.hostname (
3202963) - chore: bumped aw-server version to 0.13.1 (
b8330f1) - docs(sync): updated README for aw-sync with proper usage instructions (
41b030a) - docs: removed +nightly from example command (
6a93563) - Remove references to nightly rust release (
01107b6) - perf: improve performance of filter_period_intersect (#436) (
55cad4a) - docs: removed old mention of caveats (
0240dc0) - chore: added dist to gitignore (
9b8df05)
(excluded 67 less relevant commits)
📦 aw-webui
✨ Features (43)
- feat(categories): expose category rule priority (#968) (
3e7fb7c) - feat(categories): support field-scoped regex rules on master (#952) (
a2ca625) - feat(i18n): add Swedish translation (#947) (
3eebf68) - feat(header): mark Research Edition builds (#941) (
71087a2) - feat(billing): add BillingView — category-grouped billable hours export (#938) (
d4bfd6f) - feat(categories): let builds ship a preset category set active by default (#936) (
322159b) - feat(ai-summary): add client-side AI activity summary page (#922) (
1be5633) - feat(settings): add aw-notify configuration panel (#923) (
009f484) - feat(home): engagement-gated supporter nudge + route survey/forum links through /go/ (#915) (
464405d) - feat(i18n): add vue-i18n with en, uk, de, ru, zh-CN locales (#896) (
948be8d) - feat(ui): pre-release polish pass — bug fixes, tests, and view-level revamps (#857) (
dc02ac8) - feat(home): add r/activitywatch community links (#854) (
363e1c7) - feat(settings): add privacy filter editor (#830) (
6516230) - feat: add saved query presets to Query Explorer (#829) (
f52008f) - feat(buckets): bulk delete buckets by host (closes #662) (#821) (
b8ec3c0) - feat(categorization): add category sets — named rule profiles with multi-set combining (#804) (
ea1b986) - feat(auth): bootstrap API token from URL/session (#806) (
dd7ae07) - feat(categorization): extract findCommonPhrases util with bigram support and tests (#803) (
5529031) - feat: add work time report view (#775) (
83dc881) - feat(timeline): add 'Merge by app' filter to reduce event flooding (#782) (
38663fb) - feat(timeline): add category filter to Timeline view (#778) (
137ee09) - feat(timeline): add AFK filter toggle to Timeline view (#776) (
ad06461) - feat(timeline): add keyboard and scroll panning support (#777) (
fdd2c4a) - feat: add a dynamic period to the high uncategorized time notification (#745) (
7d43d81) - feat: Add ability to better visualize value of custom events if not using title (#698) (
2cdfe0c) - feat: hide top-window titles vis on android (#737) (
360b1b4) - feat: add top bucket data by column vis (#733) (
7ed6115) - feat: enhance colorisation for Top Window Titles (#654) (
906b005) - feat(timeline): swimlanes, duration filter, and filter desc to timeline (#679) (
052656a) - feat: add Top Stopwatch Events view (#659) (
9259df7) - feat: add number input support for event data editing (#648) (
cb9a7ec) - feat: add top browser titles to activity visualization (#631) (
757f9f4) - feat: detect and set preferred theme based on user settings (#634) (
606112e) - feat(ux): improve timeline usability (#610) (
291da6f) - feat: revert to the default coloring for non-standard watchers (#613) (
85c007e) - feat: use category colors in the timeline view (#609) (
0cf7831) - feat: Add 'app' and 'title' fields to CSV export in Reports (#552) (
7c0761d) - feat: added categoryQuery support on Android, fixing 'Timeline (barchart)' visualization (
0282eec) - feat: improved timeline tooltip, including better time formatting (hide date if same day), fixes #494 (
54be44d) - feat: redesigned timeline filter settings, hid inside
<details>(609a7cc) - feat: filtering clients and hosts on timeline (#502) (
d7c70b4) - feat: added support for query caching in aw-client (#501) (
33784bd) - feat: server-side settings (#493) (
1131f9b)
🐛 Fixes (131)
Click to expand
- fix(categories): switchToSet marks dirty when active set changes, enabling Save (#965) (
2ddc69f) - fix(timeline): handle synced buckets where origin hostname contains underscores (#970) (
4cfaf0a) - fix(settings): route the notifications settings group (#972) (
8365c47) - fix(categories): don't let persisted install defaults beat a shipped preset (#974) (
2618faa) - fix(timeline): prevent mobile horizontal overflow (#971) (
ec68d20) - fix(ux): replace prompt() with modals for Android WebView compatibility (#966) (
2809ee2) - fix: split week/month desktop queries by day to avoid 30s timeout (#951) (
ec73005) - fix(android): don't merge on 'title' key for aw-watcher-android buckets (#960) (
85db7b5) - fix(categories): import JSON from Android SAF and persist a single save (#956) (
97891e1) - fix(ci): find server logs under the testing cache root, never fail on absence (#962) (
7141e39) - fix(queries): match Arc and Dia in the chrome appname patterns (#928) (
d88a9a5) - fix(query): use native date inputs in query options (#953) (
2e757c5) - fix(categories): auto-select sole hostname and stop lying about missing watchers (#950) (
13a9428) - fix: three small dashboard fixes (#232, #935, #299) (#942) (
3cbe349) - fix(layout): preserve bottom margin on small screens (#946) (
3092e41) - fix(views): guard server info before dereferencing in templates (#933) (
d9b42c2) - fix(category-builder): support hosts with only Android/ScreenTime buckets (#932) (
7db0598) - fix(settings): unify aw-notify config schema (#924) (
266a714) - fix(categories): prevent saving invalid regex patterns (#921) (
82407b4) - fix(activity): hide unsupported visualizations instead of showing warning (#919) (
e304925) - fix(queries): don't split on semicolons inside string literals (#918) (
cefc618) - fix(ci): drop brittle PAT-based dependabot automerge (#901) (
58173d8) - fix(ios): screentime compatibility patch with Greptile review fixes (#917) (
bf0fc84) - fix(categories): filter null/empty segments before saving class name (#902) (
a5ec97b) - fix(build): allow root git dependencies for npm >= 12 (fixes activitywatch#1356) (#913) (
749585f) - fix(buckets): show phone icon for Android devices in Raw Data view (#905) (
5799225) - fix(activity): detect Android device at runtime for view selection (#903) (
de79efe) - fix(categories): allocate safe numeric ID when class list is empty (#892) (
0c0b846) - fix(deps): resolve 16 npm audit vulnerabilities via audit fix (#893) (
122a2ca) - fix(i18n): use Intl.DateTimeFormat for locale-aware date/time display (#894) (
17d4a4b) - fix(buckets): surface real server error message on import failure (#890) (
f24f6e9) - fix(tests): skip cross-locale assertions when Node lacks full-icu (#884) (
5b77a78) - fix(deps): override esbuild to patched version (#867) (
38fcf69) - fix(activity): revert timeline_barchart as wide vis — breaks default 3-vis layout (#863) (
8768475) - fix(timeline): keep scroll zoom anchored to cursor (#860) (
53b1499) - fix(activity): widen timeline barchart card (
89d8a77) - fix(deps): override vulnerable d3-color (#858) (
afa1e61) - fix(score): show selected period label (#845) (
5c04d24) - fix(categories): keep durations readable for long names (#843) (
c72fffa) - fix(timeline): localize chart date labels (#825) (
adbddb4) - fix(ci): restore PAT for dependabot auto-merge (#837) (
475442e) - fix(query-explorer): solid Rename/Delete buttons for saved queries (#835) (
0072d36) - fix(ui): replace
<wbr>with zero-width space in timeline labels, move bulk-delete to dropdown (#834) (0db3447) - fix(ci): skip unused setup-cml Vega install (#832) (
266b20b) - fix(deps): remove obsolete Vue CLI Jest plugin (#833) (
ddbb4f8) - fix(ci): repair dependabot automation (#828) (
62ee4ed) - fix: remove deprecated keyboard option from vis-timeline (#826) (
18a3946) - fix(timeline): wrap long bucket labels on narrow screens (#822) (
af1f3fd) - fix(settings): prevent null localStorage values from overriding state defaults (#815) (
8d9a7f8) - fix(views): use queryOptions.start for +1 week button (closes #817) (#819) (
907959c) - fix(deps): patch Dependabot security blockers (#812) (
f4b9379) - fix(query-options): prefer known hosts over unknown defaults (#809) (
444ed4f) - fix(categories): keep Top Categories colors when category query contains encoded segments (#781) (
f2d0396) - fix(deps): reduce npm vulnerabilities from 37 to 32 via overrides (#771) (
1db85aa) - fix(queries): use query_bucket directly when full bucket ID is known (#760) (
1c7802b) - fix(timeline): truncate long synced bucket names in sidebar (#757) (
1393ec6) - fix(timeline): position tooltip above cursor to prevent overlap (#758) (
fc5bdd9) - fix: allow single-date selection in timeline date range picker (#767) (
8d32ea9) - fix(timeline): use group.id instead of group.content for bucket ID lookup (#765) (
0c0368c) - fix(sunburst-clock): respect startOfDay offset when rendering the clock (#766) (
86a71c8) - fix: support file exports in Tauri webview (#763) (
919e9f3) - fix(settings): prevent categorization crash when hostname not yet resolved (#759) (
cd5aafe) - fix: add Helium to browser list (#744) (
c32b635) - fix: resolve npm security vulnerabilities (qs, babel) (#762) (
cbeca31) - fix(views): load categories on Query Explorer mount (#753) (
0cc1e2f) - fix(categories): prevent duplicate names from causing shared edits (#755) (
a2256c4) - fix(settings): prevent confirm dialog persisting after leaving settings (#754) (
5fe4025) - fix: minor label fixes to TimelineBarChart (#674) (
345f3ee) - fix: add uppercase names for some browsers (#695) (
e2e6abf) - fix: fix dark mode timeline colors (#705) (
ebeb847) - fix: fix duplicate android hosts in header (#725) (
61b9f58) - fix: add Floorp Browser support (#683) (
076d050) - fix: add another name for Zen Browser (#685) (
afef52e) - fix: handle ^ and $ in rules (#684) (
34b42ed) - fix: remove router guard for unsaved category settings (#664) (
9842d3e) - fix: add another name for Brave (#653) (
f64e785) - fix: correct duration formatting logic (#643) (
2b14364) - fix: add Zen Browser to browser list (
1860f15) - fix: fix tests (#642) (
53cbaaa) - fix: update upload-artifact action to version 4 (#641) (
8ec401c) - fix: add browser names from Flathub (#623) (
053b8d6) - fix: add chromium-browser (#630) (
8f6e767) - fix: correctly invert colors of alerts in dark mode (#591) (
e6ad4cd) - fix: add a default color for Media category (#593) (
6ed3e83) - fix: add browser app name
Microsoft Edge Betaon macOS (#595) (ba1305d) - fix: fixed extra space before punctuation in Home view on desktop (
2f3d1e8) - fix: fixes issue with migrating category settings to the server (#583) (
54769b7) - fix: dark mode (Timeline, Activity, Raw Data) (#575) (
05c25c9) - fix: add saturday as option for 'start of week' setting (
80db006) - fix: only save updated settings to server, store theme and landingpage in localStorage as well (#573) (
021acc4) - fix: removed unused guard (
bf16309) - fix: fixed test needing to await async loading of settings (
98dee43) - fix: fixed categories and views not being stored/loaded from server-side settings (
b99efb4) - fix: correctly convert
wordsfrom map to array (#569) (5993db3) - fix: dark mode (Stopwatch, Category Builder) (#570) (
8245c37) - fix: showing of
UncategorizedNotification(#571) (1b1209d) - fix: correct URL encoding for category filter query params (#566) (
d3a22c2) - fix: hopefully fixes bug in category builder for 'constructor' word (and other prototype stuff) (#565) (
9d58554) - fix: fixes bug in category builder when word 'constructor' exists (#564) (
74b0d31) - fix: add 'librewolf-default' browser appname (#541) (
75dc005) - fix: add 'Arc.exe' to browser appnames (#553) (
ba148a9) - fix: added librewolf-default browser appname (
dd37252) - fix: move 'brave browser' browser-to-appname entries (#283) (
b867e80) - fix: fix URL matching for toggling of dark-mode style element (#562) (
b54b5cb) - fix: fixed dark theme toggle in webpack (
64bc94d) - fix: added pwa manifest generation in vite (
f608a1e) - fix: make files in ./static serve at root (harmonize webpack and vite) (
b78ad4f) - fix: fix CSP for both vite and webpack (
8b2d886) - fix: fixed vite builds! (
a5a6ea0) - fix: more progress on vite builds (
b9978e3) - fix: rename jest.config.js -> jest.config.cjs (
b62b4c3) - fix: fixed broken icons (
0b032ec) - fix: changed
requiretoimport(c7cdade) - fix: Handle date clearing in Activity view (#554) (
97a1089) - fix: converted components to typescript (#556) (
400ba07) - fix: fixed Search view returning all events unfiltered, and converted component to typescript (#555) (
3a6a218) - fix: use settings store to retrieve useColorFallback setting (#533) (
23df3fb) - fix: add app name for Vivaldi on macOS (#520) (
845b12f) - fix: made navbar menu toggler visible in dark mode (
7de395b) - fix: open edit modal when 'Add Category' clicked (add top-level category) (
5540cb8) - fix: fixed Score visualization on Android (
d0d3682) - fix: reload buckets when opening Buckets view (
51330e4) - fix: fixed IBucket.first_seen for aw-server-python (
8babe10) - fix: never choose 'unknown' host as default for category builder (
819c4e3) - fix: sort hosts by last_updated in buckets store, so that the first host is probably the primary one (
fcbd586) - fix: made CSP stricter in prod (#503) (
35ad0ae) - fix: respect request timeout setting (ActivityWatch/activitywatch#979) (
e05e805) - fix: better edge browser support (
9600814) - fix: better librewolf browser support (#499) (
d1fb86b) - fix: correct the regex for GIMP in default category rules (#483) (
608296f) - fix: support Yandex browser on macOS (#490) (
62043c7)
🔨 Misc (16)
Click to expand
- docs(ai-summary): link the published agents-and-ai guide (#958) (
3ba41f4) - docs: add subscribe CTA to the Home Support section (#914) (
edb7d71) - chore: bump media submodule (
0a43547) - test(timeline): add regression tests for cursor-anchored zoom (#847) (#866) (
9cdc708) - docs: add --webpath instructions for aw-server-rust (#764) (
934daca) - refactor(queries): simplify browser detection using case-insensitive regex, support Firefox ESR (#752) (
f3d95d4) - chore: add .pre-commit-config.yaml and fix formatting (
b16d3bb) - chore: fix formatting (
60706f1) - chore: hide API Browser link while running rust servers (#614) (
a0e70bc) - chore: fix some typos in comments (#720) (
11785df) - style: fix Raw JSON visibility in dark mode (#736) (
691c57b) - chore: add macos browser app name for Zen (#675) (
ca6fafd) - refactor: migrate timeline.js to typescript (#680) (
52b2360) - test: fixed import errors in tests (
cc82b3d) - refactor: converted the remaining components to typescript (#558) (
3ae4060) - Revert "fix: use settings store to retrieve useColorFallback setting (#533)" (
6bffa65)
(excluded 102 less relevant commits)
📦 media
🔨 Misc (2)
Full Changelog: v0.12.1...v0.14.0