I launched my own service monitor (with a focus on simplicity and agility)

The beginning Over the past few months, I’ve realized that one of the things that bothers me most as a dev is not knowing when one of my services goes down. It might sound silly, but it’s frustrating to find out hours later — or worse, from someone else. I’ve tried a few well-known monitoring tools, and while they do work, I always felt like they were doing way too much for something that should be simple: "Is the service up or not?" That’s when I decided to build something of my own. Nothing too ambitious at first — I just wanted a minimal solution that could notify me quickly, without huge dashboards or 50 different settings. And that’s how ServiceIsUp was born. It started as a small side project out of necessity, but ended up growing more than I expected. In this post, I just want to share how it started, what it does today, and maybe hear what you would’ve done differently if it were your project. A little after the beginning The very first version of ServiceIsUp was literally just a script running on a cron job that pinged a few URLs and sent me a message on Telegram if something failed. Rough and functional. Like this class Controller: def __init__(self, location): # query batch size self.query_limit = 500 # list size of messages to send to broker self.messages_list_size = 100 self.location = location self.cache_lock_key = f'query_lock_controller_{self.location.name}' self.cache_lock_timeout = 60 self.lock_time = timezone.now() def send_messages(self, messages): try: broker_conn = Broker( broker_host=env.broker_host, broker_port=env.broker_port, broker_user=env.broker_user, broker_pass=env.broker_pass ) except Exception as e: raise Exception(f"Error to init broker connection: {e}") broker_conn.connect() for message in messages: message_json = json.dumps(message['message']) broker_conn.set_queue(message['queue']) broker_conn.send_message(message_json) broker_conn.close() But as I kept using it, I realized there was room to make it look nicer. Simple things, like: Setting up multiple services easily. Seeing the check history. Having a minimal interface (just the essentials). Choosing where I want to get alerts (email, Telegram, WhatsApp...). And that’s when the fun began—turning my little project into something usable by other people, not just me. I created a basic dashboard, set up a simple API, added an authentication system... and without even realizing it, I ended up with a mini SaaS

Apr 24, 2025 - 21:49
 0
I launched my own service monitor (with a focus on simplicity and agility)

The beginning

Over the past few months, I’ve realized that one of the things that bothers me most as a dev is not knowing when one of my services goes down.
It might sound silly, but it’s frustrating to find out hours later — or worse, from someone else.

I’ve tried a few well-known monitoring tools, and while they do work, I always felt like they were doing way too much for something that should be simple:
"Is the service up or not?"

That’s when I decided to build something of my own. Nothing too ambitious at first — I just wanted a minimal solution that could notify me quickly, without huge dashboards or 50 different settings.

And that’s how ServiceIsUp was born.
It started as a small side project out of necessity, but ended up growing more than I expected.
In this post, I just want to share how it started, what it does today, and maybe hear what you would’ve done differently if it were your project.

A little after the beginning

The very first version of ServiceIsUp was literally just a script running on a cron job that pinged a few URLs and sent me a message on Telegram if something failed. Rough and functional.

Like this

class Controller:
    def __init__(self, location):
        # query batch size
        self.query_limit = 500
        # list size of messages to send to broker
        self.messages_list_size = 100


        self.location = location
        self.cache_lock_key = f'query_lock_controller_{self.location.name}'
        self.cache_lock_timeout = 60
        self.lock_time = timezone.now()

    def send_messages(self, messages):
        try:
            broker_conn = Broker(
                broker_host=env.broker_host,
                broker_port=env.broker_port, 
                broker_user=env.broker_user,
                broker_pass=env.broker_pass
            )
        except Exception as e:
            raise Exception(f"Error to init broker connection: {e}")

        broker_conn.connect()
        for message in messages:
            message_json = json.dumps(message['message'])
            broker_conn.set_queue(message['queue'])
            broker_conn.send_message(message_json)
        broker_conn.close()

But as I kept using it, I realized there was room to make it look nicer. Simple things, like:

Setting up multiple services easily.

Seeing the check history.

Having a minimal interface (just the essentials).

Choosing where I want to get alerts (email, Telegram, WhatsApp...).

And that’s when the fun began—turning my little project into something usable by other people, not just me.
I created a basic dashboard, set up a simple API, added an authentication system... and without even realizing it, I ended up with a mini SaaS