Void Presence was the first thing I shipped that real people actually used. Not a hobby project, not a portfolio piece — something people paid attention to, downloaded, reported bugs on. That changes you.
What it is
A desktop application that controls your Discord Rich Presence with status cycles, custom images, and smart filtering. Built as local-first: no mandatory cloud login, your data stays on your machine. The core is written in Electron and TypeScript, with a Go microservice handling auto-updates and releases.
Simple idea. Complicated execution.
Discord's hidden bug
The first real issue came from a user in Turkey. He reported that his RPC would stop updating after a few hours, even though Void Presence was still running and sending updates. I spent a day digging into logs, tracing the IPC communication, checking Discord's RPC protocol. Everything looked correct on our side.
Then I realized: Discord was caching a long-lived RPC connection and not refreshing it. The problem wasn't our app — it was Discord silently holding an outdated state. Once we understood that, the fix was simple: forcefully close and reconnect the RPC every 30 minutes. It looked like we were solving a bug in our app, but we were actually working around Discord's behavior.
The 30-minute reconnect was a temporary workaround. Eventually Discord fixed the bug on their end, and we removed the workaround. But for months it kept users happy while Discord figured out their own infrastructure.
That taught me something: shipping production software means debugging problems that don't exist in your code. Half the time you're fighting platform quirks, not bugs. Sometimes the best solution is a pragmatic workaround, not waiting for someone else to fix their infrastructure.
600+ downloads and what that means
Seven months from the initial release to 600+ downloads. No viral moment, no HackerNews frontpage. Just steady, organic growth.
Those numbers don't sound like much. They're not — not compared to real products. But each download represents someone who found the project, read the README, decided it was worth running. They're not your friends, not people obligated to care. They chose it.
Zero critical security incidents in those months. Three minor bug fixes, all from user feedback. Small community, serious users.
What production taught me
Writing code for yourself is one thing. Writing code that runs on other people's machines is another. The cost of an error scales with your users. A 404 on my machine during development is a typo. A 404 on a user's machine is their feature not working. No server access in my environment is expected. No server access in production means your user can't do anything.
I learned to think about failure modes: what happens when Discord's API times out, when the user's internet drops, when the update server is down. You can't prevent these. But you can make them graceful. Retry logic, cached fallbacks, offline states, clear error messages. Each one costs time to implement. Each one feels invisible until it matters.
I added Sentry for monitoring, implemented retry logic with exponential backoff, added offline fallbacks for status cycles. Not because they were fun to build, but because I knew someone would rely on the app working when things broke.
Why this matters for what I'm building next
Void Presence was my first full-stack ship. I owned the entire stack: architecture decisions, release infrastructure, crash handling, user support. I learned that shipping is different from building. Building is about solving problems. Shipping is about solving problems reliably, repeatedly, for people you'll never meet.
That's why I'm moving towards NestJS and enterprise patterns now. Not because I want to write more code, but because I want to write code that scales past me. Proper error boundaries, structured logging, type safety at every layer, documented APIs. The boring stuff that matters.
Void Presence taught me that the difference between a portfolio project and real software isn't complexity. It's responsibility. Real software breaks and people feel it. So you build it to not break.
