Installation Date: 2025-11-17 System Status:FULLY OPERATIONAL - ALL TRACKERS ACTIVE


🎯 What You Have

Full activity tracking that monitors:

  • Websites visited
  • Code written
  • Claude tools used
  • Directories worked in
  • Git commits
  • Chrome profiles
  • Google accounts
  • Applications used

Total: 8 watchers + 1 browser extension = 9 trackers


📊 Active Trackers (8/8 - 100%)

Custom Watchers (5)

✅ Terminal watcher          (PID: 9358) - Every 10s
✅ Git watcher              (PID: 9360) - Every 30s
✅ Chrome profile watcher   (PID: 9362) - Every 30s
✅ Claude activity watcher  (PID: 9364) - Every 15s
✅ Claude tool usage       (PID: 9366) - Every 10s

Built-in Watchers (3)

✅ Window tracking  - Active app & titles
✅ AFK detection    - Active vs idle time
✅ Browser extension - Web browsing (Chrome)

🗂️ Data Buckets (9 Buckets Active)

BucketWhat It TracksEvents
aw-watcher-terminal_*🖥️ Terminal & directoriesActive
aw-watcher-git_*🔀 Git repos & commitsActive
aw-watcher-chrome-profiles_*👤 Chrome profiles & Google accountsActive
aw-watcher-claude_*🤖 Claude sessionsActive
aw-watcher-claude-tools_*🔧 Claude tool usageActive
aw-watcher-window_*🪟 Active applicationsActive
aw-watcher-afk_*⏰ Active/idle timeActive
aw-watcher-web-chrome🌐 Websites visitedActive

🔧 What Each Tracker Does

#TrackerTracksUse For
1Claude ActivitySessions, duration, files, project, dirAI-assisted time, patterns
2Claude ToolsTool calls, file types, frequencyWhich tools used most
3TerminalDirs, shell, terminal app, git repoTime per project
4Git/GitHubRepo, branch, owner, files, commitsTime per repo
5Chrome ProfileProfile, Google email, account switchesWork vs personal
6BrowserURLs, titles, time per siteSite time, research
7WindowActive app, titles, switchesApp time, context switches
8AFKKeyboard/mouse, idle timeActual work time

🚀 Quick Start

Check System Status

# View all watchers
./scripts/start-custom-watchers.sh status

# View all buckets
curl -s http://localhost:5600/api/0/buckets/ | jq 'keys'

Control Watchers

# Start all watchers
./scripts/start-custom-watchers.sh all

# Start only Claude watchers
./scripts/start-custom-watchers.sh claude

# Stop all watchers
./scripts/start-custom-watchers.sh stop

# Restart all
./scripts/start-custom-watchers.sh restart

View Logs

# Claude activity
tail -f ~/Library/Application\ Support/activitywatch/logs/aw-watcher-claude.log

# Claude tool usage
tail -f ~/Library/Application\ Support/activitywatch/logs/aw-watcher-claude-tools.log

# Terminal
tail -f ~/Library/Application\ Support/activitywatch/logs/aw-watcher-terminal.log

# Git
tail -f ~/Library/Application\ Support/activitywatch/logs/aw-watcher-git.log

# Chrome profiles
tail -f ~/Library/Application\ Support/activitywatch/logs/aw-watcher-chrome-profiles.log

View Data

# Open web dashboard
open http://localhost:5600

# Check browser stats
venv/bin/python3 scripts/show-browser-stats.py

# Verify browser extension
./scripts/verify-browser-extension.sh

📈 Example Queries

Total AI-Assisted Development Time Today

from aw_client import ActivityWatchClient
from datetime import datetime

client = ActivityWatchClient()
today = datetime.now().replace(hour=0, minute=0, second=0)

bucket_id = f"aw-watcher-claude_{client.client_hostname}"
events = client.get_events(bucket_id, start=today)

total_time = sum(e["duration"].total_seconds() if hasattr(e["duration"], 'total_seconds') else e["duration"] for e in events)
print(f"Claude usage today: {total_time/3600:.2f} hours")

Most Used Claude Tools Today

from collections import defaultdict

bucket_id = f"aw-watcher-claude-tools_{client.client_hostname}"
events = client.get_events(bucket_id, start=today)

tools = defaultdict(int)
for e in events:
    for tool, count in e["data"].get("tools_used", {}).items():
        tools[tool] += count

print("Tool usage today:")
for tool, count in sorted(tools.items(), key=lambda x: x[1], reverse=True):
    print(f"  {tool}: {count} times")

Complete Development Summary

from aw_client import ActivityWatchClient
from datetime import datetime

client = ActivityWatchClient()
today = datetime.now().replace(hour=0, minute=0, second=0)

# Get all development-related buckets
claude_bucket = f"aw-watcher-claude_{client.client_hostname}"
terminal_bucket = f"aw-watcher-terminal_{client.client_hostname}"
git_bucket = f"aw-watcher-git_{client.client_hostname}"

claude_events = client.get_events(claude_bucket, start=today)
terminal_events = client.get_events(terminal_bucket, start=today)
git_events = client.get_events(git_bucket, start=today)

claude_time = sum(e["duration"].total_seconds() if hasattr(e["duration"], 'total_seconds') else e["duration"] for e in claude_events)
terminal_time = sum(e["duration"].total_seconds() if hasattr(e["duration"], 'total_seconds') else e["duration"] for e in terminal_events)
git_time = sum(e["duration"].total_seconds() if hasattr(e["duration"], 'total_seconds') else e["duration"] for e in git_events)

print("📊 Development Summary Today:")
print(f"  Claude-assisted: {claude_time/3600:.2f}h")
print(f"  Terminal work: {terminal_time/3600:.2f}h")
print(f"  Git activity: {git_time/3600:.2f}h")
print(f"  AI-assisted ratio: {claude_time/(claude_time+terminal_time)*100:.1f}%")

📚 Documentation Map

Quick References

| Document | Purpose | |———-|———| | COMPLETE-TRACKING-SYSTEM.md | ⭐ This file - System overview | | TRACKING-OVERVIEW.md | Original tracker overview (pre-Claude) | | INSTALLATION-COMPLETE.md | Installation summary | | CUSTOM-WATCHERS-QUICKSTART.md | Quick command reference |

Tracking Guides

| Document | Purpose | |———-|———| | CLAUDE-TRACKING-GUIDE.md | 🤖 Claude activity tracking | | CHROME-TRACKING-SETUP.md | 🌐 Browser tracking setup |

Technical Documentation

| Document | Purpose | |———-|———| | scripts/README-CUSTOM-WATCHERS.md | Watcher development | | .claude/skills/activitywatch-integration/ | Complete API reference |


💡 Use Cases

1. AI Productivity

from aw_client import ActivityWatchClient
from datetime import datetime

client = ActivityWatchClient()
today = datetime.now().replace(hour=0, minute=0, second=0)

claude_events = client.get_events(f"aw-watcher-claude_{client.client_hostname}", start=today)
claude_hours = sum(e["duration"].total_seconds() for e in claude_events) / 3600
files_with_claude = sum(e["data"].get("files_modified", 0) for e in claude_events)

files_per_hour = files_with_claude / max(claude_hours, 0.1)
print(f"With Claude: {files_per_hour:.1f} files/hour")

2. Account Tracking

from aw_client import ActivityWatchClient
from datetime import datetime

client = ActivityWatchClient()
today = datetime.now().replace(hour=0, minute=0, second=0)

profile_events = client.get_events(f"aw-watcher-chrome-profiles_{client.client_hostname}", start=today)
by_account = {}
for e in profile_events:
    for acc in e["data"].get("google_accounts", []):
        email = acc.get("email")
        if email:
            duration = e["duration"].total_seconds() if hasattr(e["duration"], 'total_seconds') else e["duration"]
            by_account[email] = by_account.get(email, 0) + duration

for email, duration in sorted(by_account.items(), key=lambda x: x[1], reverse=True):
    print(f"  {email}: {duration/3600:.2f}h")

3. Project Time

from aw_client import ActivityWatchClient
from datetime import datetime
from collections import defaultdict

client = ActivityWatchClient()
today = datetime.now().replace(hour=0, minute=0, second=0)

terminal_events = client.get_events(f"aw-watcher-terminal_{client.client_hostname}", start=today)
git_events = client.get_events(f"aw-watcher-git_{client.client_hostname}", start=today)

by_project = defaultdict(float)
for e in terminal_events:
    project = e["data"].get("cwd", "").split("/")[-1] or "Unknown"
    by_project[project] += e["duration"].total_seconds()
for e in git_events:
    project = e["data"].get("repo_name", "Unknown")
    by_project[project] += e["duration"].total_seconds()

for project, duration in sorted(by_project.items(), key=lambda x: x[1], reverse=True)[:10]:
    print(f"  {project}: {duration/3600:.2f}h")

4. Tool Usage

from aw_client import ActivityWatchClient
from datetime import datetime, timedelta
from collections import defaultdict

client = ActivityWatchClient()
week_ago = datetime.now() - timedelta(days=7)

events = client.get_events(f"aw-watcher-claude-tools_{client.client_hostname}", start=week_ago)
tools = defaultdict(int)
for e in events:
    for tool, count in e["data"].get("tools_used", {}).items():
        tools[tool] += count

for tool, count in sorted(tools.items(), key=lambda x: x[1], reverse=True):
    print(f"  {tool}: {count} times")

🔄 Auto-Start Configuration

To have all watchers start automatically on login:

# LaunchAgent plist file (already created if you followed previous guides)
cat > ~/Library/LaunchAgents/com.activitywatch.custom-watchers.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.activitywatch.custom-watchers</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/alyshialedlie/activitywatch/scripts/start-custom-watchers.sh</string>
        <string>all</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/Users/alyshialedlie/Library/Application Support/activitywatch/logs/custom-watchers.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/alyshialedlie/Library/Application Support/activitywatch/logs/custom-watchers-error.log</string>
</dict>
</plist>
EOF

# Load the agent
launchctl load ~/Library/LaunchAgents/com.activitywatch.custom-watchers.plist

📊 System Health Check

Run this comprehensive check:

#!/bin/bash
echo "🔍 ActivityWatch Complete System Health Check"
echo "=============================================="
echo ""

# Server
echo -n "ActivityWatch Server: "
curl -s http://localhost:5600/api/0/info > /dev/null && echo "✅ Running" || echo "❌ Not running"

# Custom Watchers
echo ""
echo "Custom Watchers:"
./scripts/start-custom-watchers.sh status

# Buckets
echo ""
echo "Data Buckets:"
echo "=============================================="
curl -s http://localhost:5600/api/0/buckets/ | jq -r 'keys[]' | while read bucket; do
    count=$(curl -s "http://localhost:5600/api/0/buckets/$bucket/events" | jq 'length' 2>/dev/null || echo "0")

    case $bucket in
        *claude-tools*) echo "   🔧 $bucket: $count events" ;;
        *claude*) echo "   🤖 $bucket: $count events" ;;
        *web*) echo "   🌐 $bucket: $count events" ;;
        *chrome-profiles*) echo "   👤 $bucket: $count events" ;;
        *terminal*) echo "   🖥️  $bucket: $count events" ;;
        *git*) echo "   🔀 $bucket: $count events" ;;
        *window*) echo "   🪟 $bucket: $count events" ;;
        *afk*) echo "   ⏰ $bucket: $count events" ;;
        *) echo "   📊 $bucket: $count events" ;;
    esac
done

echo ""
echo "=============================================="
echo "✅ System health check complete!"

📋 What You Can Track

CategoryMetrics
Dev WorkAI-assisted time, tool usage, files modified, project context
Version ControlRepos, branches, commits, GitHub activity
Web ActivitySites visited, research time, docs, social media
AccountsGoogle account switches, work vs personal separation
ProductivityActive/idle time, app usage, context switches

✅ Status

  • System: Fully Operational
  • Trackers: 8/8 Active (100%)
  • Data: Collecting
  • Docs: Complete

Dashboard: http://localhost:5600 Support: .claude/skills/activitywatch-integration/


Created: 2025-11-17 ActivityWatch Version: v0.13.2 Custom Trackers: 5 Total Tracking Systems: 9 Status: 🎉 COMPLETE