I built a free, privacy-first WakaTime alternative (using Go & MongoDB)
I admit it: I love coding stats (maybe sometimes).
There is something satisfying about seeing exactly how many hours I spent in VS Code this week, or realizing that my "quick script" actually took 4 hours of debugging.
For years, WakaTime has been the gold standard for this. It’s a great tool, but I had two problems:
- Privacy: I wasn't comfortable sending my detailed file names and coding activity to a third-party server.
- Cost: I wanted historical data (past 2 weeks) without paying a monthly subscription.
So, being a developer, I did the only logical thing: I spent 3 weeks building my own version.
Meet TakaTime.
It is an open-source extension for VS Code and Neovim that tracks your coding activity and syncs it to your own personal MongoDB.
The Architecture: Speed is Everything
My biggest fear was creating a plugin that slowed down my editor. Neovim users (myself included) are obsessed with speed. If saving a file takes even 100ms longer because of my plugin, it’s getting uninstalled.
To solve this, I used a Hybrid Architecture:
-
The Editor Plugin (Thin Client):
-
VS Code: A lightweight
TypeScriptextension. -
Neovim: A pure
Luaplugin.
-
VS Code: A lightweight
Job: These plugins do almost nothing. They just detect a "Save" event or a "Keystroke" and pass a tiny message to a background process.
-
The Core (Heavy Lifter):
- Written in
Go(Golang). - It runs as a background binary process.
- It handles the database connection, the caching, the debouncing, and the API calls.
- Written in
Because the editors communicate with the Go binary asynchronously, the main thread is never blocked. You can mash :w or CTR+S (Save) as fast as you want, and your editor won't freeze.
The "Heartbeat" Logic
You can't just upload to the database every time you press a key. That would crash your network and spam your DB.
Instead, I implemented a Debounced Heartbeat system.
Event: You type code.
Cache: The Go binary records the timestamp and file name in memory.
Check: If the last upload for this file was less than 2 minutes ago, do nothing.
Upload: If it's been >2 minutes, push a "Heartbeat" to MongoDB.
This reduces database writes by 99% while still keeping your stats accurate.
The Stack: Why MongoDB Atlas?
I needed a database that was:
- Free (forever).
- Easy to access from anywhere (Cloud).
- NoSQL (flexible schema for different file types).
MongoDB Atlas was the perfect fit. Their free tier offers 512MB of storage. Since text-based heartbeat data is tiny, that 512MB is enough to store years of coding history for a single user.
The best part? You own the data. I don't see it. You just paste your connection string into the plugin, and it talks directly to your cluster.
Setting it Up (It takes 2 mins)
I wanted the onboarding to be as smooth as possible.
1. For VS Code Users
I published the extension to the Marketplace. It automatically downloads the correct Go binary for your OS (Windows, Mac, or Linux) when you first install it.
Link : Download For VS Code
2. For Neovim Users
I built a Lazy.nvim compatible plugin.
return {
"Rtarun3606k/taka-time.nvim",
lazy = false,
config = function()
require("taka-time").setup()
end,
}
Link For neovim nvim takatime
The Payoff: GitHub Profile Stats
Collecting data is useless if you can't see it.
I built a CLI tool (packaged with the binary) that generates a markdown report. You can run this using a GitHub Action to automatically update your Profile README every night.
Create the Workflow
Create a file in your repo at .github/workflows/takatime.yml and paste this content:
name: Update TakaTime Stats
on:
schedule:
- cron: "0 0 * * *" # Runs every midnight UTC
workflow_dispatch: # Allows manual trigger
jobs:
update-readme:
runs-on: ubuntu-latest
permissions:
contents: write # Needed to download releases
steps:
- name: Download Taka-Report Binary
env:
GH_TOKEN: ${{ github.token }}
run: |
# Downloads the latest stable binary
gh release download --repo Rtarun3606k/TakaTime --pattern "taka-report-linux-amd64" --output taka-report
chmod +x taka-report
- name: Generate Report & Update Profile
env:
MONGO_URI: ${{ secrets.MONGO_URI }}
GIST_TOKEN: ${{ github.token }}
TARGET_REPO: ${{ github.repository }}
run: ./taka-report -days=7
It looks like this:
What's Next?
This project was a massive learning experience in cross-platform systems engineering. And building this taught me more about processes, threads, and CI/CD than any lecture could.
The project is Open Source and I'd love your help!
-
Web Dashboard: I'm planning to build a React-based web dashboard to view historical trends. -
More Editors: IntelliJ/JetBrains support is on the roadmap.
If you like the idea of owning your data, give it a try!
Repo: github.com/Rtarun3606k/TakaTime
Happy Coding!






Top comments (8)
Great Project Tarun, what is the maximum dashboard time interval that it displays?
For now we can view up to yesterday, 7 days ,1 month , All time. In next version we will consider adding this feature thank you !!!
interesting, Finally, a privacy-focused alternative! I've been looking for something like this. Great work.
Thank you!! hope you enjoy using this
How heavy is the background process? Does it consume a lot of RAM?
It's extremely lightweight! Since it's a compiled Go binary, it sits around <10MB RAM and only wakes up when you save.
Does this work for other editors like IntelliJ or PyCharm yet? or just VS Code/Vim?
Right now just VS Code and Neovim, but JetBrains support is definitely on the roadmap! Let me know if you want to contribute.