The free and open-source automated time tracker.
Records what you do so that you can know how you've spent your time.
All in a secure way where you control the data.
Website · Documentation · Downloads · Forum · Discord
ActivityWatch is an app that automatically tracks how you spend time on your computer. It records:
- Active application & window title — know exactly which app and document you were using
- Browser tab & URL — see how much time you spend on each website
- AFK detection — tracks keyboard/mouse activity to know when you're actually at the computer
All data stays on your machine. No cloud, no accounts, no telemetry. You own it.
| Problem | ActivityWatch's answer |
|---|---|
| Privacy concerns | All data stored locally, open source, fully auditable |
| Manual time tracking | Fully automatic — install and forget |
| Hard to extend | REST API, client libraries, plugin ecosystem |
| Platform lock-in | Windows, macOS, Linux (and Android) |
| Low data resolution | Stores raw events, queryable with a built-in query language |
Basics
| Owns data | GUI | Sync | Open source | |
|---|---|---|---|---|
| ActivityWatch | ✅ | ✅ | WIP, decentralized | ✅ |
| Selfspy | ✅ | ❌ | ❌ | ✅ |
| ulogme | ✅ | ✅ | ❌ | ✅ |
| RescueTime | ❌ | ✅ | Centralized | ❌ |
| WakaTime | ❌ | ✅ | Centralized | Clients only |
Platforms
| Windows | macOS | Linux | Android | |
|---|---|---|---|---|
| ActivityWatch | ✅ | ✅ | ✅ | ✅ |
| Selfspy | ✅ | ✅ | ✅ | ❌ |
| ulogme | ❌ | ✅ | ✅ | ❌ |
| RescueTime | ✅ | ✅ | ✅ | ✅ |
Tracking capabilities
| App & Window | AFK | Browser ext. | Editor plugins | Extensible | |
|---|---|---|---|---|---|
| ActivityWatch | ✅ | ✅ | ✅ | ✅ | ✅ |
| Selfspy | ✅ | ✅ | ❌ | ❌ | ❌ |
| RescueTime | ✅ | ✅ | ✅ | ❌ | ❌ |
| WakaTime | ❌ | ✅ | ✅ | ✅ | Editors only |
For the complete list of watchers and integrations, see the documentation.
Download the latest release for your platform from the releases page.
For step-by-step instructions, see the getting started guide.
See the installing from source guide.
Prerequisites:
- Python 3.8+ and pip
- Node.js (for the web UI)
- Rust toolchain (optional, for
aw-server-rust) - Poetry (Python dependency management)
git clone https://github.com/ActivityWatch/activitywatch.git
cd activitywatch
git submodule update --init --recursive
make buildgraph TD;
aw-qt["<b>aw-qt</b><br/>Tray app & process manager"];
aw-notify["<b>aw-notify</b><br/>Notifications"];
aw-server["<b>aw-server</b><br/>Data store & REST API"];
aw-webui["<b>aw-webui</b><br/>Web dashboard"];
aw-watcher-window["<b>aw-watcher-window</b><br/>Window tracking"];
aw-watcher-afk["<b>aw-watcher-afk</b><br/>AFK detection"];
aw-watcher-web["<b>aw-watcher-web</b><br/>Browser extension"];
aw-watcher-input["<b>aw-watcher-input</b><br/>Input statistics"];
aw-sync["<b>aw-sync</b><br/>Multi-device sync"];
aw-qt -- Manages --> aw-server;
aw-qt -- Manages --> aw-notify -- Queries --> aw-server;
aw-qt -- Manages --> aw-watcher-window -- Heartbeats --> aw-server;
aw-qt -- Manages --> aw-watcher-afk -- Heartbeats --> aw-server;
aw-qt -- Manages --> aw-watcher-input -- Heartbeats --> aw-server;
Browser -- Manages --> aw-watcher-web -- Heartbeats --> aw-server;
aw-server <-- Push/Pull --> aw-sync;
aw-server -- Serves --> aw-webui;
| Component | Language | Description |
|---|---|---|
aw-server |
Python | Default server — REST API, datastore, and query engine |
aw-server-rust |
Rust | High-performance server implementation (planned default) |
aw-webui |
TypeScript/Vue | Web dashboard for visualizing activity data |
aw-qt |
Python | System tray app that manages all components |
aw-watcher-window |
Python | Tracks active application and window title |
aw-watcher-afk |
Python | Detects AFK state from keyboard/mouse input |
aw-watcher-input |
Python | Collects keyboard/mouse input statistics |
aw-watcher-web |
JS | Browser extension tracking active tab and URL |
aw-notify |
Python | Desktop notifications based on activity rules |
aw-core |
Python | Core library with shared data models and utilities |
aw-client |
Python | Client library for the REST API |
The server exposes a REST API with:
- Buckets API — create, retrieve, and delete data buckets (containers for related activity data)
- Events API — read and write timestamped events within buckets
- Heartbeat API — watchers send heartbeat signals to update current activity state
- Query API — built-in query language for filtering, merging, grouping, and transforming events
- Export — export activity data in JSON format (individual buckets or complete datasets)
Client libraries: aw-client (Python), aw-client-js (JS), aw-client-rust (Rust)
The built-in web dashboard (aw-webui) provides:
- Activity timeline — visual overview of your day with app usage breakdowns
- Query explorer — write and execute queries in the browser
- Category rules — define custom categories to group activities
- Raw data browser — inspect individual events across all buckets
This is the bundle repository that brings all ActivityWatch components together via git submodules. It serves as:
- A meta-package for building and packaging the full suite
- The home of release artifacts (releases page)
- A central place for cross-cutting concerns (CI, packaging scripts, integration tests)
make build # Build everything (installs Python modules, builds web UI)
make test # Run test suite across all submodules
make lint # Lint all submodules
make typecheck # Type-check all submodules
make update # Pull latest and rebuild
make clean # Remove build artifactsSet AW_EXTRAS=true to also build aw-notify and aw-watcher-input. Set SKIP_SERVER_RUST=true to skip the Rust server.
Explore the codebase interactively on CodeCanvas.
Contributions are welcome! See CONTRIBUTING.md for guidelines.
Good places to start:
- Issues labeled
good first issueorhelp wanted - Requested features on the forum
- Writing new watchers or tools for the ecosystem
- Donate — fund development
- Contributor stats — see who's building ActivityWatch
- CI overview — build status at a glance
Licensed under MPL-2.0. Free to use, modify, and distribute.
Built with ❤️ by the ActivityWatch community
