Skip to content

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.enabled set 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-qt is 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 / GATED lines).

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:

  1. 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).
  2. App match (if configured) — that workspace’s app allowlist is empty (no filter), or at least one regex pattern matches the ActivityWatch window app name 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/repo label when known.
  • Wrong app (non-empty allowlist and no pattern matches the focused window) → external with a synthetic label _app:ApplicationName so 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 CloudTeam 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

SettingTypeDefaultDescription
devManager.team.enabledbooleanfalseMaster switch for Team Tracker.
devManager.team.idleWindowMinutesnumber2Minutes of silence before a tick is treated as idle (1–15).
devManager.team.useActivityWatchbooleantrueQuery the local ActivityWatch server for OS-wide input.
devManager.team.requireActivityWatchbooleantrueIf true, no time is recorded when ActivityWatch is not reachable.
devManager.team.activityWatchUrlstringhttp://localhost:5600Base URL of aw-server.

Changing these keys triggers a collector restart so new values apply without reloading the window.

Commands

CommandDescription
SnakeFlow: Team Tracker — LoginSign in; can enable team tracking.
SnakeFlow: Team Tracker — LogoutStop tracking and sign out.
SnakeFlow: Team Tracker — StatusQuick summary in a notification.
SnakeFlow: Team Tracker — Show Activity LogOutput channel with per-minute reasons.
SnakeFlow: Team Tracker — Start/Stop ActivityWatchSame as status-bar toggle (palette access).
SnakeFlow: Team Tracker — Edit App AllowlistWorkspace admin: edit regex allowlist for ActivityWatch window app/title (server-side).
SnakeFlow: Team Tracker — Create WorkspaceAdmin: new workspace + invite.
SnakeFlow: Team Tracker — Join WorkspaceJoin with invite code.
SnakeFlow: Team Tracker — Manage WorkspacesList / switch context.
SnakeFlow: Team Tracker — Sync Commits (admin)Push aggregated commit counts for dashboards.

See also