Work Tracker
A privacy-respecting WakaTime alternative built on Appwrite. Tracks your coding time automatically, breaks it down by project, language, and day, and shows it all in a modern web dashboard with goals and streaks.
✨ Features🕒 Automatic, frictionless tracking
📊 Insightful web dashboard
🎯 Goals & streaks
🔐 Privacy-first
⚙️ Developer-friendly
🚀 Quick start1. Install the extensionInstall from the VS Code Marketplace, or via CLI:
2. Create a free accountOpen the web dashboard, sign up with email + password. 3. Generate an API keyIn the dashboard, go to Settings → API Keys and click Generate Key. Give it a name (e.g. "My Laptop"). 4. Connect VS CodeIn VS Code, run Work Tracker: Setup API Key from the Command Palette ( 5. Start codingOpen any file. The status bar will show today's coding time. Visit the dashboard anytime to see your stats. 📸 Dashboard previewThe web dashboard lives at work-tracker.appwrite.network and includes:
The Reports page offers detailed per-day breakdowns, top projects with medals 🥇🥈🥉, editing pattern stats (longest session, peak hour, write ratio, active days), and 5 advanced insights. The Goals page shows live progress rings for each goal with live ticking every minute. ⚙️ ConfigurationAll settings live under the
Example:
|
| Command | Description |
|---|---|
Work Tracker: Setup API Key |
Paste a new API key from the dashboard. |
Work Tracker: Open Dashboard |
Open the web dashboard in your browser. |
Work Tracker: Open Goals |
Open the goals page in your browser. |
Work Tracker: Toggle Tracking |
Pause/resume tracking globally. |
Work Tracker: Flush Heartbeats Now |
Force-upload any queued heartbeats. |
Work Tracker: Show Status |
Show user, queue size, and tracking state. |
🛡️ Privacy
- No code is uploaded. Only file paths, project names, languages, line counts, and timestamps are sent to your Appwrite backend.
- Use
excludePatternsto skip folders likenode_modules,dist,.env, etc. - Use the global
trackingEnabled: falseto disable all tracking instantly. - Delete your account from the Appwrite console to remove all data permanently.
- Self-hostable: bring your own Appwrite project to keep data on your own infrastructure.
🏗️ Architecture
┌─────────────────┐ heartbeats ┌──────────────┐
│ VS Code │ ─────────────────▶ │ Appwrite │
│ Extension │ (every 5min) │ Cloud │
│ (TypeScript) │ │ (TablesDB) │
└────────┬────────┘ └──────┬───────┘
│ │
│ offline queue │ tables
│ (JSON file) ▼
│ ┌──────────────┐
│ │ React │
│ web dashboard ◀──────── │ Dashboard │
│ (read-only) │ (Vite SPA) │
└────────────────────────────└──────────────┘
- Extension (
src/) — TypeScript, esbuild, Appwrite Node SDK, local JSON offline queue - Web dashboard (
web/) — React 19, Vite 6, Tailwind 3, Recharts, Appwrite Web SDK, deployed on Appwrite Sites
🧰 Development
npm install # install extension deps
npm run watch # build on save (extension)
# Press F5 in VS Code to launch the Extension Development Host
npm run test # run unit tests (vitest)
npm run package # build a .vsix
Web dashboard (separate)
cd web
npm install
npm run dev # vite dev server with HMR
npm run build # production build
Appwrite backend setup
The extension expects an Appwrite project with the following tables (see appwrite/setup.ps1 for the full idempotent script):
heartbeats— one row per coding sessionprojects— per-project metadata (color, isHidden, trackingEnabled)goals— daily/weekly time targetsapi_keys— generated keys for extension auth
All tables need permissions: create("any"), read("any"), update("any"), delete("any").
🤝 Contributing
Issues and PRs welcome at github.com/harendra21/work-tracker.
📄 License
npm run package && npx vsce publish