Skip to content

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 13 Sep 20:07
· 34 commits to master since this release

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-dir cli param and AW_SYNC_DIR env 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 Beta on 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 words from 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 require to import (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