With modern AI tools like Cursor, Claude 3.7, and Windsurf, "vibe coding" has become a superpower. You open an editor, prompt an LLM with a couple of paragraphs, and watch a working prototype appear in minutes.
Naturally, any developer or technical freelancer looking at a $29/year time tracker has the exact same thought:
"Wait. A local desktop app that logs active windows to a SQLite database and renders a timeline? I can vibe code that this Saturday in Python or Tauri with an LLM for free."
It is an honest, tempting thought. In fact, that is how most developer tools start.
A working prototype of a time tracker takes about 90 minutes to vibe code. But turning that prototype into a reliable, battery-efficient, daily-driver background utility is an entirely different beast.
Here is what happens when you decide to vibe code your own automated time tracker—and why the rabbit hole is much deeper than it looks.
1. The 90-Minute Illusion: Why the Prototype Feels Trivial
The first version of a DIY tracker really is easy to build with an LLM. You ask Claude or ChatGPT for a script that inspects active windows, and within an hour, you have something that feels 80% done:
# The 10-line vibe-coded prototype
import win32gui
import time
import sqlite3
while True:
window = win32gui.GetForegroundWindow()
title = win32gui.GetWindowText(window)
# write title and timestamp to sqlite...
time.sleep(5)
You run it, alt-tab between VS Code and your browser, run SELECT * FROM events, and see your window titles recorded. You feel like a genius who just avoided paying for commercial software.
Then Monday morning arrives, you try to use it during actual client work, and the real OS engineering begins.
2. The OS Permissions and Security Rabbit Hole
An automated tracker cannot just be a simple web app; it has to live at the operating system level. And modern operating systems treat anything monitoring window activity with extreme suspicion.
- On macOS: Getting the active window title requires Accessibility permissions, CoreGraphics APIs (
CGWindowListCopyWindowInfo), and sometimes Screen Recording entitlements. If Apple pushes a minor macOS update, permission schemas change. Furthermore, if you build a background daemon without Apple Developer notarization, Gatekeeper complains constantly. - On Windows: UWP apps, elevated admin windows (like a terminal opened as Administrator), virtual desktops, and multi-monitor setups all report window handles differently. A basic script will crash or report blank strings the moment you click on an elevated PowerShell prompt or drag a window across monitors.
AI models can write boilerplate API calls, but they struggle to diagnose why your local hook stopped receiving system events after your machine woke up from sleep mode.
3. The Battery and Performance Tax
A naive script polls the OS every few seconds. On a plugged-in desktop, you might not notice. On a laptop running on battery power, constant polling and unoptimized wake-locks will spin up fans and drain 15% to 20% of your battery per day.
To make an activity monitor invisible to your CPU:
- You cannot just run an infinite
sleep()loop. - You need low-level OS event hooks (win32 event hooks or macOS workspace notifications) rather than continuous polling.
- You have to throttle database writes using in-memory write buffers so you are not waking up the SSD every three seconds.
Tuning an app to consume less than 0.5% CPU and a few dozen megabytes of RAM requires deep profiling, not just prompt iterations.
4. Accurate Idle Detection Is Deceptively Hard
When did you actually stop working?
- If you step away to get a glass of water for 3 minutes, should that split your 2-hour coding session into two separate blocks?
- If you are reading a long technical specification or watching a client video walkthrough, you have not touched the keyboard or mouse for 4 minutes—are you "idle"?
- What happens when the machine locks, goes to sleep, or is connected to an external display that turns off?
Handling edge cases between user inactivity, system sleep states, full-screen video playback, and quick interruptions is several hundred lines of delicate state-machine logic. If your script gets this wrong, your Friday timeline will be riddled with phantom 10-hour work blocks or fragmented into 2-minute micro-slivers.
5. Raw Event Logs Do Not Equal a Readable Day
Even if you record every window title perfectly, you are left with a database table containing 20,000 raw events:
09:14:02 - Chrome: PR #422 Review
09:14:15 - Slack: Team General
09:14:28 - Chrome: PR #422 Review
09:14:31 - Terminal: git commit -m "fix"
09:14:35 - VS Code: index.ts
Nobody can bill a client from raw event logs.
Turning raw noise into usable data requires:
- Noise filtering: Discarding 2-second Alt-Tab switches and fleeting notification clicks so they do not break your continuous work sessions.
- Block clustering: Intelligently grouping related short activities into structured work blocks (like Threshyr’s "Day in Blocks").
- Deterministic rule hierarchy: Matching regex patterns across window titles, browser URLs, and application names, while handling conflicts when multiple rules match.
- Retroactive re-classification: If you add a new project rule at 4:00 PM, your engine should instantly re-index the morning's activities without corrupting manually adjusted entries.
6. The Real Opportunity Cost: A Quick Calculation
Let us be conservative. Suppose you are a skilled developer using AI to build, refine, and debug your personal time tracker:
- Initial UI & DB setup: 4 hours
- OS API integration (macOS + Windows) & permissions: 6 hours
- Idle detection & sleep/wake edge cases: 4 hours
- Rule-matching engine & clustering logic: 6 hours
- Invoicing exports, rounding rules, & editing UI: 5 hours
- Ongoing maintenance when OS updates break something: 1 hour/month
That is 25+ hours of initial work, plus recurring maintenance.
| If Your Billable Rate Is: | Building It Yourself Costs You: | Threshyr Annual License: |
|---|---|---|
| $75 / hour | $1,875 | $29 |
| $100 / hour | $2,500 | $29 |
| $150 / hour | $3,750 | $29 |
Spending 25 hours building internal tooling that someone else has already built, tested, and optimized is almost never a profitable trade.
Vibe Code Your Business Logic, Not Your Desktop Plumbing
Vibe coding is one of the most exciting shifts in software development. It is incredible for building customer-facing features, spinning up custom internal dashboards, prototyping SaaS products, and automating business workflows.
But an offline, local-first time tracker is not just business logic—it is native desktop plumbing. It requires OS API stability, seamless idle state machines, battery optimization, and continuous maintenance across platform updates.
We built Threshyr so you do not have to spend your weekends debugging window hooks or building timesheet export parsers.
For $29 a year, you get a polished, native, privacy-respecting tracker that runs silently on your machine, organizes your day into blocks, and keeps 100% of your data on your own drive.
Keep your deep work hours for the code that pays your bills. Download Threshyr at /download and let it handle the tracking.
Written by Affan Bajwa
Founder of Threshyr. Passionate about local-first software architecture, developer productivity, and building privacy-first tools for knowledge workers.
Track your time automatically. Without the cloud.
No timers to click. No cloud tracking. Your private window titles and project logs stay on your machine forever.
Available for Windows & macOS • Pre-release at $29/yr
Related Articles
Why We Hate Manual Time Tracking (and What Actually Works)
Why manual start-stop timers destroy focus and leak billable revenue, the psychology behind tracking friction, and how passive local tracking solves it.

Software Should Be Getting Cheaper. Why Isn't It?
Building software has never been cheaper or faster, yet subscription prices continue to climb. Here is why software pricing broke away from production costs.