Team Tracker
Team Tracker records active minutes (1-minute ticks) while you work in VS Code or Cursor, classifies them per team workspace as internal or external based on the Git remote of the active editor, and sends aggregates to the SnakeFlow team API. It is optional and off until you sign in and enable it.
Requirements
- SnakeFlow: Team Tracker — Login (GitHub OAuth via the editor).
devManager.team.enabledset to true (the login command can turn this on for you).- For OS-wide mouse and keyboard coverage outside the editor: ActivityWatch (
aw-qt) on your machine (recommended; see below).
ActivityWatch and the status bar
When ActivityWatch is running, the extension can see input activity across apps (browser, terminal outside VS Code, etc.) so you do not drop to idle only because the editor has no events. If the window watcher (aw-watcher-window_* bucket) is present, the extension also reads the currently focused application name and window title once per minute (cached briefly) for app allowlist classification and for the status-bar tooltip.
- Click the Team Tracker status-bar item to start
aw-qt(if it is installed) or stop ActivityWatch (terminates the local ActivityWatch processes on your OS). - If
aw-qtis not found, you get a prompt to open the download page. - SnakeFlow: Team Tracker — Show Activity Log (Command Palette) opens the detailed trace (
ACTIVE/IDLE/GATEDlines).
Hard gate (requireActivityWatch)
When devManager.team.requireActivityWatch is true (default), no minutes are counted unless the ActivityWatch REST API is reachable at activityWatchUrl. The status bar shows a red blocked icon and the tooltip explains that time is not being recorded until you start ActivityWatch.
Turn requireActivityWatch off only for roles that should not be forced (for example admins on their own machines).
What counts as “active”
Within the configured idle window (idleWindowMinutes), any of these refreshes the activity clock:
- Text edits, selection changes, active editor switch, save
- Terminal open / state change, debug start / breakpoint change
- Executed commands (AI-related commands are tagged separately in the log)
- Editor scroll (visible ranges change), window focused again
- ActivityWatch: recent not-afk / input when enabled and reachable
Each UTC day is capped by the backend (see API docs).
Internal vs external
For each workspace you belong to, a tick is internal only when both are true:
- Repo match — the current GitHub-style remote of the active text editor (
owner/repo) matches that workspace’s repo patterns (glob-style, same as before). - App match (if configured) — that workspace’s app allowlist is empty (no filter), or at least one regex pattern matches the ActivityWatch window
appname or window title (case-insensitive). Patterns are stored on the server per workspace (admins edit them; every member receives them via/api/team/me).
Otherwise the tick is +1 external for that workspace:
- Wrong repo → external with the real
owner/repolabel when known. - Wrong app (non-empty allowlist and no pattern matches the focused window) → external with a synthetic label
_app:ApplicationNameso the backend can store per-source external minutes alongside real repos.
Empty app allowlist means “any application counts” for the app filter; only repo patterns decide internal vs external.
Note: When ActivityWatch marks you active while you are focused in another app, repo classification still uses the last active editor in Cursor/VS Code. Keep a relevant file focused when you care about correct internal routing. If a workspace has a non-empty app allowlist but the window watcher is not installed or has no bucket, ActivityWatch may not report app/title → the tick is treated as not matching the allowlist and counts as external for that workspace.
App allowlist (admin)
Workspace admins maintain the list of regex strings on the server:
- SnakeFlow Cloud → Team tab → workspace toolbar → Edit app allowlist (camera icon), which opens the same flow as the command below.
- SnakeFlow: Team Tracker — Edit App Allowlist (Command Palette) — comma-separated regexes; leave empty to clear the list (allow all apps again).
The server validates each pattern as a JavaScript RegExp (case-insensitive flag) and rejects invalid syntax. There is a hard limit on how many patterns and how long each string may be (see API implementation).
Tip: Patterns are matched against both the executable / app name and the window title (for example Cursor or \.tsx in the title), similar in spirit to ActivityWatch categorization but enforced by your team’s allowlist for SnakeFlow reporting.
Settings
| Setting | Type | Default | Description |
|---|---|---|---|
devManager.team.enabled | boolean | false | Master switch for Team Tracker. |
devManager.team.idleWindowMinutes | number | 2 | Minutes of silence before a tick is treated as idle (1–15). |
devManager.team.useActivityWatch | boolean | true | Query the local ActivityWatch server for OS-wide input. |
devManager.team.requireActivityWatch | boolean | true | If true, no time is recorded when ActivityWatch is not reachable. |
devManager.team.activityWatchUrl | string | http://localhost:5600 | Base URL of aw-server. |
Changing these keys triggers a collector restart so new values apply without reloading the window.
Commands
| Command | Description |
|---|---|
| SnakeFlow: Team Tracker — Login | Sign in; can enable team tracking. |
| SnakeFlow: Team Tracker — Logout | Stop tracking and sign out. |
| SnakeFlow: Team Tracker — Status | Quick summary in a notification. |
| SnakeFlow: Team Tracker — Show Activity Log | Output channel with per-minute reasons. |
| SnakeFlow: Team Tracker — Start/Stop ActivityWatch | Same as status-bar toggle (palette access). |
| SnakeFlow: Team Tracker — Edit App Allowlist | Workspace admin: edit regex allowlist for ActivityWatch window app/title (server-side). |
| SnakeFlow: Team Tracker — Create Workspace | Admin: new workspace + invite. |
| SnakeFlow: Team Tracker — Join Workspace | Join with invite code. |
| SnakeFlow: Team Tracker — Manage Workspaces | List / switch context. |
| SnakeFlow: Team Tracker — Sync Commits (admin) | Push aggregated commit counts for dashboards. |
See also
- All settings → — full
devManager.*tables - Command palette reference →