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)

Bucket What It Tracks Events
aw-watcher-terminal_* 🖥️ Terminal & directories Active
aw-watcher-git_* 🔀 Git repos & commits Active
aw-watcher-chrome-profiles_* 👤 Chrome profiles & Google accounts Active
aw-watcher-claude_* 🤖 Claude sessions Active
aw-watcher-claude-tools_* 🔧 Claude tool usage Active
aw-watcher-window_* 🪟 Active applications Active
aw-watcher-afk_* ⏰ Active/idle time Active
aw-watcher-web-chrome 🌐 Websites visited Active

🔧 What Each Tracker Does

# Tracker Tracks Use For
1 Claude Activity Sessions, duration, files, project, dir AI-assisted time, patterns
2 Claude Tools Tool calls, file types, frequency Which tools used most
3 Terminal Dirs, shell, terminal app, git repo Time per project
4 Git/GitHub Repo, branch, owner, files, commits Time per repo
5 Chrome Profile Profile, Google email, account switches Work vs personal
6 Browser URLs, titles, time per site Site time, research
7 Window Active app, titles, switches App time, context switches
8 AFK Keyboard/mouse, idle time Actual 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

Category Metrics
Dev Work AI-assisted time, tool usage, files modified, project context
Version Control Repos, branches, commits, GitHub activity
Web Activity Sites visited, research time, docs, social media
Accounts Google account switches, work vs personal separation
Productivity Active/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