VS Code Time Tracking Extensions: Which One Is Right for Your Projects?

Keito Team
20 April 2026 · 10 min read

Compare VS Code time tracking extensions for project tracking. Covers setup, project detection, file-level tracking, and what IDE extensions miss.

Integration Guides

A VS Code time tracking extension monitors your keystrokes, file saves, and project switches inside the editor, then assigns that activity to the correct project automatically — no manual timers required.

You spend six to eight hours a day in VS Code. Your editor already knows which files you open, which projects you switch between, and which languages you write. Yet almost none of that data reaches your timesheet. Instead, you alt-tab to a browser, start a timer, forget to stop it, and end the week with entries that look like guesswork. The gap between what your editor sees and what your billing records show is fixable — if you pick the right extension and configure it properly.

This guide compares the main categories of VS Code time tracking extensions, walks through project detection setup, and explains what these tools miss so you can fill those gaps.

How do VS Code time tracking extensions work?

Most extensions use a heartbeat model. Every time you type, save a file, or switch tabs, the extension sends a small data packet — a heartbeat — to a local or cloud-based service. If no heartbeat arrives for a set period (typically two to five minutes), the extension marks you as idle.

That idle detection threshold matters. Set it too low and a five-minute think-through gets excluded. Set it too high and lunch breaks inflate your totals. Most extensions default to five minutes, which suits focused coding but underestimates debugging sessions where you stare at output logs.

Beyond idle detection, extensions typically capture:

  • Project name — derived from the workspace folder, .git remote, or a config file
  • File path — which file was active when the heartbeat fired
  • Language — detected from the file extension or VS Code’s language mode
  • Branch — pulled from the current git branch, useful for feature-level reporting
  • Timestamp — millisecond-precise, so overlapping windows can be reconciled

Data storage varies. Activity-based trackers often sync to a cloud dashboard. Timer-based tools may store entries locally or push them to a project management platform. Privacy-focused options keep everything on your machine.

Extensions fall into three broad categories. Your choice depends on whether you want passive tracking, manual control, or productivity analytics.

Activity-based trackers

These run silently in the background. You install them, authenticate, and forget. They record every heartbeat and build a timeline of your day without any manual input.

The strength is accuracy. Because tracking is automatic, there are no forgotten timers and no reconstruction at the end of the week. The weakness is that they only capture what happens inside VS Code. Anything outside the editor — meetings, browser-based code reviews, documentation reading — is invisible.

Activity-based trackers suit developers who spend the majority of their working hours writing code and want hands-off time capture.

Timer-based trackers

These add a start/stop button to your status bar. You click to begin, click to end. Some support slash commands in the integrated terminal. Entries are tagged with the current project and can be pushed to external time tracking platforms.

The strength is control. You decide exactly when tracking starts and stops, which makes the data match your billing expectations. The weakness is human error. Forgetting to start the timer is common. Forgetting to stop it is worse.

Timer-based trackers suit freelancers who bill by the hour and need entries that map directly to client invoices.

Productivity-focused trackers

These blend time data with code metrics. They track not just how long you spend, but how much you produce — lines changed, commits pushed, files touched. Some overlay flow-state indicators or distraction scores.

The strength is insight. You can see which tasks consume disproportionate time relative to output. The weakness is noise. Metrics like “lines of code per hour” can mislead — deleting 200 lines of dead code is valuable work that looks like negative productivity.

Productivity trackers suit team leads who want trends rather than billing data.

Which type should you pick?

Ask one question: who consumes this data?

If it feeds an invoice, pick a timer-based tracker. If it feeds a personal dashboard, pick an activity-based tracker. If it feeds a sprint retrospective, pick a productivity tracker. Mixing purposes with a single tool leads to data that serves nobody well.

Key Takeaway: Match the extension type to the audience — invoice recipients need timers, developers need passive tracking, managers need metrics.

How do you set up project detection for accurate tracking?

The most common complaint about VS Code time tracking extensions is misattributed time. You switch from one client project to another but the extension records everything under a single project name. Fixing this requires understanding how detection works.

Workspace-based detection

Most extensions read the root folder name of your VS Code workspace. If you open ~/projects/client-a, the project is recorded as client-a. This works until your folder naming is inconsistent — clientA, client_a, and Client-A become three separate projects in your dashboard.

Fix: Adopt a naming convention and stick with it. Lowercase, hyphenated names (client-a-api, client-a-frontend) group naturally in alphabetical reports.

Git remote detection

Some extensions read the .git/config file and extract the remote URL. This is more reliable than folder names because the remote rarely changes. It also handles the case where multiple developers clone the same repo into differently named local folders.

Fix: Ensure every project has a git remote configured, even for local experiments. A private repository on any git hosting service gives the extension a stable identifier.

Multi-root workspaces

VS Code supports multi-root workspaces — a single window with multiple project folders. This confuses extensions that assume one workspace equals one project. Heartbeats fire against whichever file is active, but the project attribution depends on which root folder contains that file.

Fix: Check your extension’s documentation for multi-root support. Some handle it natively. Others need a .wakatime-project file or equivalent in each root folder to override detection.

Manual mapping

When automatic detection fails, most extensions allow manual overrides. A config file in the project root (.wakatime-project, .codetime, or similar) sets the project name explicitly. This is the most reliable method for complex setups.

Verification

After configuring detection, spend ten minutes switching between projects and checking the dashboard. Catching a misconfiguration on day one saves hours of manual correction later.

What do VS Code extensions miss (and how do you fill the gaps)?

A VS Code extension tracks what happens inside VS Code. Your working day includes much more.

Meetings. Stand-ups, planning sessions, and client calls consume hours that no editor extension can see. If you bill for meeting time, you need a calendar-based tracker running alongside your IDE extension.

Browser-based code reviews. Reviewing pull requests on a hosting platform happens in a browser, not in VS Code. Some activity-based tools offer browser extensions that capture this. Without one, review time — often 20-30% of a senior developer’s week — goes unrecorded.

Research and documentation. Reading API docs, searching for solutions, and writing design documents happen outside the editor. These are legitimate working hours that extensions miss entirely.

Debugging with external tools. Database clients, API testing tools, log viewers, and terminal sessions outside VS Code are invisible to the extension. If your debugging workflow lives partly outside the editor, your tracked time will be lower than your actual time.

Communication. Slack messages, email threads, and async discussions about architecture decisions take real time. None of it shows up in editor-based tracking.

How do you close the gap?

Pair your VS Code extension with two other data sources:

  1. Calendar integration — pull meeting durations automatically from your calendar provider
  2. Git-based tracking — use commit and PR activity to capture work that spans tools

The combination of editor heartbeats, calendar events, and git activity covers roughly 90% of a developer’s billable day. The remaining 10% — Slack threads, research rabbit holes — still needs manual logging, but ten percent is manageable.

This layered approach also supports developer productivity tracking without surveillance. Each data source captures output, not behaviour. There is no screenshot monitoring, no keystroke logging, and no attention scoring.

How does file-level and language-level tracking help?

The real power of a VS Code time tracking extension is granularity. Unlike a manual timesheet that says “worked on Project X for 4 hours”, an extension can tell you exactly where those four hours went.

File-level time data

Extensions that record per-file time show which files consume the most attention. A configuration file that takes 90 minutes to get right. A test file that absorbs more time than the feature it covers. A legacy module that everyone dreads touching.

This data is useful for sprint planning. If auth-middleware.ts historically takes three times longer to modify than other files of similar size, you can scope tickets accordingly.

Language breakdown

Knowing you spent 60% of the week in TypeScript, 25% in YAML, and 15% in Markdown tells a story. If you are billing for development but a quarter of your time goes to CI/CD configuration, that is worth surfacing to the client — or to your manager during resourcing discussions.

Branch tracking

Extensions that capture the active git branch let you attribute time to specific features or bug fixes. This maps directly to GitHub time tracking workflows, where branches tie to issues and issues tie to billing codes.

For teams that practise trunk-based development, branch tracking is less useful. But for feature-branch workflows, it turns your VS Code activity into a per-feature time report without any manual tagging.

Identifying time sinks

When you combine file-level data with language breakdown, patterns appear. You might discover that YAML configuration files consume 15% of your week across all projects. Or that test files take longer to write than the code they test. These patterns inform tooling decisions, training investments, and architecture choices.

Client reporting

For agencies and freelancers, file-level data adds credibility to invoices. Instead of “8 hours — backend development”, you can provide “3.2 hours — API endpoint development, 2.1 hours — database migration, 1.5 hours — test coverage, 1.2 hours — CI pipeline configuration”. Clients rarely question detailed breakdowns.

Key Takeaways

  • Activity-based extensions track automatically but miss everything outside VS Code
  • Timer-based extensions give billing control but rely on human memory
  • Project detection needs consistent folder naming or git remote configuration
  • Pair your extension with calendar and git tracking to cover the full working day
  • File-level and branch-level data turns rough estimates into defensible time reports

Frequently Asked Questions

Do VS Code time tracking extensions work offline?

Yes. Most activity-based extensions queue heartbeats locally when you are offline and sync them when connectivity returns. Timer-based extensions store entries locally until they can push to the server. Check your extension’s offline policy — some cap the local queue at 24 hours, others store indefinitely.

Can I track time across multiple VS Code windows?

Yes. Extensions that use a background process or system-level daemon handle multiple windows natively. Each window sends heartbeats independently, and the backend deduplicates overlapping timestamps. If you split a project across two windows, verify that both report under the same project name.

Do these extensions affect VS Code performance?

The impact is minimal. Heartbeat extensions send small JSON payloads every few minutes — less data than a single API call in your terminal. Timer-based extensions add a status bar button and an occasional network request. Neither type measurably affects editor responsiveness or extension host memory.

How do I stop tracking sensitive or personal projects?

Most extensions support an ignore list or a project blacklist. You can exclude specific folders, file patterns, or workspace names from tracking. Some offer a global toggle — a status bar button that pauses all tracking until you re-enable it. Check your extension’s privacy settings before installing it on a machine with personal projects.

Can I export VS Code time data to my invoicing tool?

Yes. Activity-based trackers typically offer CSV or JSON exports, and some have direct integrations with invoicing and project management platforms. Timer-based extensions that sync to external services inherit that platform’s export options. For a fully automated pipeline, look for extensions with API access so you can build a custom integration that pushes time data into your billing workflow.


Ready to track time smarter?

Flat-rate time tracking with unlimited users. No per-seat surprises.