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

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