I Built A Macos Menu Bar App To Track My Freelance Time — Here's How
As a freelance developer juggling multiple clients, I had one recurring problem: I never really knew where my time was going.
I tried spreadsheets. I tried Toggl. I tried telling myself "I'll write it down later." You know how that ends.
So I did what any developer does when they can't find the perfect tool — I built my own. Meet KronoBar ????
What is KronoBar?
KronoBar is a lightweight macOS menu bar app that lets you log time entries per client and project, without ever leaving your workflow. It lives quietly in your tray, one click away.
No account. No cloud. No subscription. Just a clean local app that minds its own business.
Why not just use an existing tool?
Honestly? Most time trackers are either too heavy, too expensive, or require you to live inside a browser tab. I wanted something that:
-
Doesn't interrupt my flow — a quick
Cmd + Shift + Tis all it takes - Stays local — all data lives on my machine (SQLite, no sync, no tracking)
- Shows me the right info fast — today's breakdown, weekly stats, nothing more
Features (the good stuff)
- ???? Color-coded clients — see at a glance where your day went
- ???? Today / History / Stats views — browse by day, week, month, or year
- ???? CSV export — for invoicing or just your own records
- ⌨️ Global shortcut —
Cmd + Shift + Ttoggles the window from anywhere - ???? Dark mode — obviously
- ???? 100% local — your data never leaves your machine
Tech stack
I used this project as an opportunity to experiment with a stack I don't usually touch in my day-to-day (I'm mainly a PHP/Symfony dev):
| Layer | Tech |
|---|---|
| Desktop shell | Electron + Electron Forge |
| UI | React + TypeScript |
| Build | Vite |
| Database | SQLite via sql.js (WASM — zero native deps!) |
| Styling | CSS Modules |
The most interesting decision was using sql.js instead of a native SQLite binding. It runs SQLite compiled to WebAssembly, which means no native Node modules to deal with — packaging and distribution become much simpler.
The WASM SQLite trick
If you've ever tried bundling a native Node addon in an Electron app, you know the pain. Platform-specific builds, node-gyp nightmares, ARM vs x64 headaches.
sql.js sidesteps all of that. The database runs entirely in WASM inside the renderer process. The tradeoff: you manage persistence yourself (serialize to disk on save). For a single-user desktop app with small datasets, it's a perfect fit.
// Persisting the DB is just:
const data = db.export();
fs.writeFileSync(dbPath, Buffer.from(data));
Simple. Clean. No native deps.
What's next
This started as a weekend experiment and has become my daily driver. Here's what's coming:
- [ ] Invoicing tool integration — connect KronoBar directly to your billing workflow
- [ ] External app sync — an open interface to push your data to third-party tools (Notion, Airtable, you name it)
- [ ] Weekly reports — get a proper summary of your week, ready to share or archive
- [ ] Windows - maybe conversion for Windows
Try it / contribute
The project is open source under MIT. If you're a freelancer or consultant dealing with multi-client time tracking, give it a spin — and feel free to open an issue if something doesn't work or if you have ideas.
???? github.com/splyy/KronoBar
git clone https://github.com/splyy/KronoBar.git
cd KronoBar
chmod +x install.sh
./install.sh
⚠️ macOS may block the app on first launch since it's not signed with an Apple Developer cert. The install script handles this automatically with
xattr.
Built with ☕ and mild frustration at existing time trackers.
Tags: #electron #react #typescript #macos #opensource #freelance #sqlite #sideproject
Popular Products
-
Classic Oversized Teddy Bear$23.78 -
Gem's Ballet Natural Garnet Gemstone ...$171.56$85.78 -
Butt Lifting Body Shaper Shorts$95.56$47.78 -
Slimming Waist Trainer & Thigh Trimmer$67.56$33.78 -
Realistic Fake Poop Prank Toys$99.56$49.78