It all started on a lazy Sunday afternoon. You know those days when youāre just scrolling mindlessly through Twitter, and your browser starts acting up? Yeah, one of those. My ARC browser was being particularly dramatic that day, probably throwing a tantrum because I had about 47 tabs open (donāt judge, we all do it - thatās why we switched to ARC in the first place, right?).
So there I was, desperately trying to figure out why my RAM was disappearing faster than free pizza at a developer meetup. I opened Activity Monitor, but come on - its interface looks like it was designed in the era when people still debated tabs vs spaces. Thatās when nostalgia hit me, and I found myself missing the clean, terminal-based beauty of htop from my Linux days.
āLet me home brew a htop (I donāt have it installed on my mac, like seriously? during my career I used monitoring tools like top, htop, 3 or 4 times and Iām not even kidding, like what the fuck Iād need them for? š¤·āāļø), then I thought wait is there a decent gui alternative for macOS,ā I thought. Big mistake. Or maybe the best mistake ever?
After browsing through some alternatives that looked like they were designed when dial-up internet was still cool š¾, I had what alcoholics call a āmoment of clarityā: āHey, Iāve been meaning to learn Rust, and everyoneās talking about this Tauri shitā¦ and I donāt want to build the next 1 billion dollar todo list app š¤ā
āHow hard could it be to build a system monitor? Itās just numbers going up and down, right?ā
Oh, sweet summer child.
First stop: The Rust book. You know, the one everyone says you should read cover to cover before even thinking about writing āHello, World!ā I made it halfway through, just enough to understand ownership and borrowing (which is like learning about relationships in therapy - itās all about who owns what and whoās just borrowing feelings), and that Traits are basically Rustās way of doing interfaces like in Go. Then I had my second moment of clarity: āWait a minute, Rust is a systems languageā¦ thereās gotta be a crate for system stuff, right?ā
Turns out, there were like fifty of them. But hey, decision paralysis is just part of the modern developer experience, right?
Now for the frontend. Tauri is framework-agnostic, which means I couldāve used React or Angular. But letās be real - shipping your app with React is like bringing an entire orchestra when all you needed was a kazoo. Plus, Iāve got principles, dammit! Thatās when I remembered Svelte, that beautiful compiler-first framework that React developers are now trying to copy with their ācompiler magicā (Howās that for innovation, Zuck?).
The first iteration wasā¦ functional. Basic Tauri invokes were working (just sprinkle invoke()
everywhere like itās fairy dust āØ), but it looked about as exciting as a terminal running ping
. And if weāre making a GUI (and not shipping an entire Chromium instance like some other electron-ic frameworks I could mention - yeah, weāre using native webview because weāre not monsters), it better look good. Thatās when the icon adventure beganā¦
I spent THREE DAYS just trying to figure out how to get proper icons for processes. THREE. DAYS. The solution? A weird combination of SimpleIcons and some regex magic that Iām pretty sure summoned a minor demon in the process.
But then something magical happened. The UI started coming together, and it actually lookedā¦ good? The dark mode wasnāt burning my retinas (looking at you, htop), and the performance metrics were dancing across the screen like they were at a disco.
You see, Iād been spending way too much time on Reddit looking at those fancy neofetch screenshots that cool kids keep sharing (you know the ones - where their terminal looks cooler than most peopleās entire desktop setup). Thatās actually what inspired the name āNeoHtopā - a little nod to neofetch and its aesthetic-obsessed community. But why stop at just pretty colors?
Thatās when it hit me - if developers can spend hours customizing their code editors šØ, why not let them do the same with their system monitor? Making the app themable wasnāt just about looking pretty; it was about giving users that same dopamine hit they get from perfectly customizing their VS Code setup. (And letās be honest, we all know at least one developer who spends more time theming their editor than actually coding.)
I threw in some fancy animations, because why not? If weāre monitoring system resources, might as well do it with style. The irony of potentially using more resources to monitor resources was not lost on me.
And I kept going! Because apparently, I canāt leave well enough alone. I added search functionality (because scrolling is so 2023), filtering by status (for those who really need to know which processes are āsleepingā - you know, like we all wish we were), and even pagination (why would an activity monitor need pagination, you ask? Wellā¦ I asked myself the same question, but couldnāt come up with a good reason why NOT to add it š¤·āāļø).
I even wrote a few posts about it on Reddit and dev.to, with a little help from ChatGPT (because who has time to write coherent sentences when youāre busy adding unnecessary features? š¤Ŗ). That backfired a bit when some keyboard warrior on dev.to decided to call me out for using ChatGPT - which I hadnāt even denied! But karma works in mysterious ways: the post got so popular that dev.to blessed me with some admin superpowers. Letās just say certain negative comments found themselves taking a journey to the bottom of the thread. Hey, with great power comes greatā¦ ability to reorganize comments? š
Then came the real āoh shitā moment. Thanks to Marouane (my friend and coworker who Iāll never forgive for this), I decided to post it on GitHub, thinking āmaybe a few people will find it useful.ā You know, the usual: mom, my puppy, and that one friend who stars everything I post.
But apparently, I wasnāt the only one who thought Activity Monitor needed a glow-up āØ. Within 24 hours, the stars started rolling in. By day six, we hit 1,000 stars š. My notifications were going crazy, and my impostor syndrome was having the time of its lifeā¦and started asking myself what is this madness? what am I doing with my life? Am I going to spend the rest of my life replying to peoples issues on GitHub? I mean, I love open source and all, but I had a life too! and a little kid to take care of! and a wife! and a house! and a mortgage! and a cat! and a dog! and a life! what the kind of shit I stepped into now?.. anyways itās just a little tool right? not like Iām building the next big thing hereā¦a bit of a stretch, but ok.
The best part? People actually started using it! Real people! And they were sending PRs and opening issues for suggestions.. stupid ones but also lot of good ones too!
And here we are now, with a full-featured system monitor that started because Arc was being a memory hog for the first time in months. The moral of the story? Sometimes the best projects come from the most mundane problems. it not really about the project, itās about the process.. the experience.. the journey.. the lessons.. the people.. the laughs.. the memories.. what the fuck am I doing with my life? what memories? what laughs? what lessons? what journey? what process? what project?ā¦ just kidding, itās about the learning by doing.
P.S. If youāre wondering about the version history (spoiler: there were a lot of āfix typoā commits hidden in the commit history under other commits messages like āupdating dependenciesā, āupdating iconsā, āupdating download linksā, etc.):
Yeah, weāre at 1.0.5 now. Each version bump represents at least one āit works on my machineā moment and several sips of coffee.
Remember kids: Sometimes the best way to learn new tech is to build something you need, even if you end up way over your head. Just make sure to add some nice animations ā they hide the pain of debugging memory leaks. And if youāre going to name your project after something, might as well pick something that the cool kids are already hyping up on Reddit! š
P.S.S. If youāre wondering how Iām writing this post, remeber Iām not using ChatGPT for this one.. with great power comes great responsibility.
Give NeoHtop a try, itās free and open source: NeoHtop on GitHub