Introducing PingPulse: Simple, Reliable Uptime Monitoring for the Homelab

go programming homelab uptime monitoring

Introduction

When it comes to running a homelab, sometimes all you need is a straightforward way to know when your apps are down—no bells, no whistles, and definitely no complicated configuration files. That’s exactly why I built PingPulse.

The Problem with Over-Engineered Monitoring

My journey began with a simple need: I wanted to know immediately when one of my apps went down so I could restart it. Tools like Monika are incredibly powerful and feature-rich, but they come with the tradeoff of heavier configuration and a steeper learning curve. For my homelab, that felt like overkill.

That said, I still believe there’s a place for these tools. In fact, I rely on Uptime Kuma to monitor all of my public-facing endpoints. I run it outside of my homelab so it remains unaffected by any internal issues.

The Evolution: From Python Scripts to Go Simplicity

The first solution I built was python-URLChecker. It wasn’t just a simple script—it was a multi-file project with support for notifications and several useful features. However, as with any project, I saw opportunities for improvement and simplification.

Later, at work, I was tasked with building a similar tool but with more enterprise-grade features, such as database storage, advanced configuration parameters, and more. I eventually ported that work to my personal GitHub as python-URLPinger.

When I brought URLPinger over from the work project, I intentionally excluded some of the heavier enterprise features. Still, it ended up being more than I needed for my homelab, especially with its dependency on a database for storing metrics. Another pain point was its reliance on JSON configuration files, which I’ve always found unwieldy for simple setups.

Ultimately, I realized I needed something even leaner, more straightforward, and tailored for my specific needs. That realization led to the creation of PingPulse.

Enter Go: The Birth of PingPulse

I’d been interested in learning Go, and it struck me as a great fit for a tool like this. That’s how PingPulse was born. The Go implementation is much simpler and more portable than my previous Python versions. The codebase is smaller, easier to understand, and does exactly what I need—no more, no less.

Features That Matter (and Nothing You Don’t)

PingPulse keeps things simple:

  • Service Monitoring: Detects when services are down, including databases (a feature missing in my earlier tools).
  • Prometheus Metrics: Emits metrics for easy scraping and alerting with tools like Grafana.
  • Simplified Configuration: Configuration is now global, eliminating the need for per-endpoint settings.
  • No Built-in Notifications: Instead of adding extra dependencies, I rely on Grafana for alerting, providing greater flexibility.

One of the biggest wins with PingPulse is portability. Unlike Python, Go produces a static binary that can run anywhere. While I usually run my tools in Kubernetes, PingPulse’s portability allows me to run it as a systemd service on one of my servers. Sometimes, that simplicity is all you really need.

Final Thoughts

PingPulse has been running in my homelab for a few weeks now without a hitch. It strikes the right balance between features, ease of use, and portability. If you’re looking for simple, no-fuss uptime monitoring for your own projects or homelab, give it a try!

Previous Post Next Post