I do a lot of consulting and agency work, and most of it gets tracked in Asana against a weekly hours goal. Forty hours, give or take. The problem was I could never tell where I stood without opening Asana, clicking into my profile, and doing the math myself. Multiple times a day. It's a small thing, but it added up to a genuinely annoying habit.
So I built a menu bar app for it. AsanaStatus sits quietly next to your clock and shows you exactly one thing: how many hours you've logged this week against your goal. Click it and you get a bit more: whether you're ahead or behind pace, and which tasks actually ate your time, most recent first.
That part was straightforward. The part that wasn't is worth writing about.
My first pass at this was simple. Query Asana for tasks assigned to me, sum up the time logged, done. I built it, ran it, and compared it against the number Asana itself shows on my profile page.
They didn't match. Not by a little. Some weeks I was showing six, seven, even ten hours less than what Asana said I'd actually logged.
I could have shrugged and called it close enough. Instead I went looking for why, because a time tracker that undercounts your hours is worse than no time tracker at all.
Turns out the gap wasn't a bug in my code, it was a wrong assumption. Asana's own weekly time total isn't scoped to tasks assigned to you. It counts every task you personally logged time against, period. That includes tasks assigned to a teammate. It includes tasks with no assignee at all, like recurring daily standups or shared client work.
A plain "my tasks" query has no way to see any of that.
The fix came from a detail I hadn't known about Asana: the moment you log time on a task, Asana automatically adds you as a follower of it, even if you're not the assignee and never touch it again. So instead of filtering by assignee, I query Asana's Advanced Search twice, once for assignee.any = me and once for followers.any = me, union the results, and then check the actual time tracking entries on each task for ones logged by me on the right date.
That closed the gap almost exactly. It's a good reminder that when your own numbers disagree with the source of truth, the source of truth usually knows something you don't.
Nothing fancy on purpose. It's a native Swift and AppKit app, no Xcode project, built with a plain Makefile calling swiftc directly. No dependencies. It runs as a menu bar item with LSUIElement set, so it never shows up in your Dock and never asks for attention it doesn't need.
Setup takes about two minutes: paste in your own Asana Personal Access Token, pick your weekly goal, pick which day starts your week, and tell it how many days you actually work (some people run 4-day weeks, some run 6, the pace math should know the difference). Your token lives in macOS Keychain and never goes anywhere except Asana's API. It also has an English/Spanish switch since that's how my own week actually goes.
It's free and fully open source: github.com/bereto-dev/asana-status
Download the .app straight from the repo, or clone it and run make if you'd rather build it yourself. I maintain this solo as a side project, so if you hit a bug, an edge case in the pace math, or a workspace setup it doesn't handle well, please open an issue. If you want to fix it yourself, even better, pull requests are genuinely welcome.
If you're tracking hours in Asana and have ever wondered why your own math didn't match the app, now you know one reason why.