{
  "version": "2",
  "generatedAt": "2026-11-06T20:51:57.517Z",
  "listing": {
    "slug": "ActivityWatch--activitywatch",
    "name": "ActivityWatch",
    "tagline": "Local automated time tracker with a documented REST API and a query language.",
    "shortTagline": "Local automated time tracker",
    "description": "ActivityWatch records active windows, browser tabs and away-from-keyboard time on your own machine. A local server stores the events and exposes a REST API for buckets, events, heartbeats, queries, settings and export. The docs include a guide for feeding summaries to an AI assistant.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "scheduling-staffing",
    "alternativeTo": [
      "RescueTime",
      "WakaTime"
    ],
    "shape": "product",
    "formFactor": "desktop",
    "executionModel": "deterministic",
    "provenance": "unknown",
    "codeStack": {
      "languages": [
        "Python",
        "Rust",
        "TypeScript"
      ],
      "frameworks": [
        "Vue",
        "Tauri"
      ],
      "packageManager": "poetry, cargo, npm",
      "database": [
        "SQLite"
      ],
      "hostingTarget": [
        "Windows",
        "macOS",
        "Linux",
        "Android"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/ActivityWatch/activitywatch",
        "owner": "ActivityWatch",
        "name": "activitywatch",
        "license": "MPL-2.0",
        "stars": 19530,
        "lastCommit": "2026-11-06"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://docs.activitywatch.net/en/latest/api/rest.html",
      "official": true,
      "hosted": "local"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Read recorded events",
        "reachable": true,
        "evidence": "GET /api/0/buckets/<id>/events in docs api/rest.rst"
      },
      {
        "job": "Summarize and filter activity",
        "reachable": true,
        "evidence": "POST /api/0/query/ and the aw-client canonical command in docs examples/agents-and-ai"
      },
      {
        "job": "Write events and heartbeats from custom watchers",
        "reachable": true,
        "evidence": "POST /api/0/buckets/<id>/events and /heartbeat"
      },
      {
        "job": "Manage buckets",
        "reachable": true,
        "evidence": "GET, POST, DELETE /api/0/buckets/"
      },
      {
        "job": "Export and import data",
        "reachable": true,
        "evidence": "GET /api/0/export and POST /api/0/import"
      },
      {
        "job": "Edit categories and rules",
        "reachable": true,
        "evidence": "POST /api/0/settings/classes: generic key-value route on aw-server and aw-server-rust; aw-webui writes that key and aw-client get_classes reads it"
      },
      {
        "job": "Delete sensitive events",
        "reachable": true,
        "evidence": "DELETE /api/0/buckets/<id>/events/<event_id>"
      },
      {
        "job": "Start, stop and install watchers",
        "reachable": false,
        "evidence": "Managed by the aw-qt or aw-tauri tray app; no such route in aw-server rest.py or aw-server-rust endpoints/mod.rs"
      },
      {
        "job": "Sync across devices",
        "reachable": false,
        "evidence": "aw-sync runs as its own tool over a shared folder; no route for it in either server"
      },
      {
        "job": "Dashboards and timeline views",
        "reachable": false,
        "evidence": "aw-webui is a visual interface; an agent reads the same data through queries"
      }
    ],
    "editions": [
      {
        "name": "Free",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/ActivityWatch/activitywatch"
          },
          {
            "kind": "binary",
            "url": "https://github.com/ActivityWatch/activitywatch/releases"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "gptme.toml in the repo configures a coding agent for contributors; no adopter skill found."
    },
    "customization": {
      "summary": "Categories and their regex rules are set in the web UI Settings page and stored as server settings, which the Settings API can also write. Toml files change what gets recorded: aw-watcher-afk.toml (timeout, poll_time) and aw-watcher-window.toml (poll_time, exclude_title). Server files aw-server.toml and aw-server-rust config.toml set host, port, CORS and an optional [auth] api_key. New data sources mean writing a watcher with aw-client.",
      "envVars": [],
      "configFiles": [
        "aw-server/aw-server.toml",
        "aw-server-rust/config.toml",
        "aw-watcher-afk/aw-watcher-afk.toml",
        "aw-watcher-window/aw-watcher-window.toml"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "surfaceKind": "admin-ui",
      "editCount": 4
    },
    "useWhen": [
      "you want your agent to summarize what you worked on today from local activity data",
      "you want to write standup notes or find uncategorized time from your own computer use"
    ],
    "accounts": [],
    "active": true,
    "lastActivity": "2026-11-06",
    "gotchas": [
      "The API has no authentication by default, so any local process can read, write and delete all data; the opt-in api_key works only in aw-server-rust",
      "Window titles and URLs are sensitive; the docs advise sending aggregated summaries, not raw events",
      "Personal time tracking, not team scheduling",
      "MPL-2.0 is file-level copyleft",
      "The REST docs warn the API is under development and error bodies are unreliable",
      "Community MCP servers exist (for example 8bitgentleman/activitywatch-mcp-server, 74 stars) but are not official"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: desktop app bundle with local server, watchers and web UI",
      "executionModel": "no model in the stack",
      "operability": "docs api/rest.rst and examples/agents-and-ai.rst in ActivityWatch/docs; security.rst for auth. Ruling 1 excludes session-cookie-only auth; this API needs no browser session, so official stands",
      "effort": "docs configuration.rst lists toml options including timeout and exclude_title; categorization.rst places categories in the Settings page. No code edit is needed for either, so light-edit did not apply",
      "editions": "Free open source with GitHub release downloads. activitywatch.net/subscribe lists support plans from $5 a month but says 'Subscribing doesn't unlock anything', so no paid edition is recorded",
      "active": "gh api: pushed 2026-11-06; release v0.14.1 on 2026-10-10; packaging and release fixes in October",
      "alternativeTo": "activitywatch.net calls it 'a great alternative to services like RescueTime, ManicTime, and WakaTime'; the README compares both in its feature tables"
    },
    "confidence": {
      "formFactor": 0.9,
      "executionModel": 0.95,
      "operability": 0.85,
      "effort": 0.7,
      "reach": 0.9,
      "editions": 0.9,
      "provenance": 0.3
    },
    "openQuestions": [
      "The vertical is a loose fit; should this sit in a personal-productivity vertical if one opens?"
    ],
    "sources": [
      {
        "url": "https://activitywatch.net/",
        "foundBy": "sourcing:scheduling-staffing:github"
      },
      {
        "url": "https://activitywatch.net",
        "foundBy": "sourcing:scheduling-staffing:curated"
      },
      {
        "url": "https://docs.activitywatch.net/en/latest/api/rest.html",
        "foundBy": "analysis"
      }
    ],
    "published": true,
    "lastCheckedAt": "2026-11-06",
    "research": {
      "stage": "verified",
      "verdict": "dispute",
      "reason": "Verified: MPL-2.0, 19.5k stars, release v0.14.1, Builder-documented local REST API. Official stands under Ruling 1 because no browser session is needed, though there is no auth by default. Categories through settings are confirmed on both servers and in aw-client. alternativeTo is confirmed on the Builder's site, not only the README. AW Pro is patronage with nothing gated, so it is not an edition.",
      "disputed": [
        {
          "field": "vertical",
          "reason": "Personal time tracking, not team scheduling or staffing. Kimai and TimeTagger set a time-tracking precedent here and no better vertical exists, but opening one is a Curator decision."
        },
        {
          "field": "customization.effort",
          "reason": "Toml files change what is recorded, but categories, the main adaptation, live in UI settings. Set to config-only because no code edit is named; the admin-ui surface stays."
        }
      ]
    },
    "url": "apps/ActivityWatch--activitywatch.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/ActivityWatch--activitywatch.json"
  }
}
