<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dario Leone</title>
    <description>The latest articles on DEV Community by Dario Leone (@dario_le).</description>
    <link>https://dev.to/dario_le</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3973814%2F6343e1f3-75b7-421b-835e-dd2c5ed2b452.png</url>
      <title>DEV Community: Dario Leone</title>
      <link>https://dev.to/dario_le</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dario_le"/>
    <language>en</language>
    <item>
      <title>How I built an API monitoring tool with FastAPI, SQLite, and a Telegram Bot</title>
      <dc:creator>Dario Leone</dc:creator>
      <pubDate>Tue, 09 Jun 2026 19:15:26 +0000</pubDate>
      <link>https://dev.to/dario_le/how-i-built-an-api-monitoring-tool-with-fastapi-sqlite-and-a-telegram-bot-hm0</link>
      <guid>https://dev.to/dario_le/how-i-built-an-api-monitoring-tool-with-fastapi-sqlite-and-a-telegram-bot-hm0</guid>
      <description>&lt;p&gt;I come from a mechanical engineering background and started building with Python to solve real problems. Last month I launched PingMon — an API monitoring SaaS (pingmon.ai). Here's what I learned about choosing the right stack for a solo project.&lt;/p&gt;

&lt;p&gt;Why FastAPI over Django or Flask&lt;/p&gt;

&lt;p&gt;I needed async from day one. The core job of a monitoring tool is making HTTP requests to check if endpoints are up — hundreds or thousands of them. Blocking I/O would kill performance.&lt;/p&gt;

&lt;p&gt;FastAPI gives me async natively, without the complexity of Django's ASGI setup or the boilerplate of Flask + gevent.&lt;/p&gt;

&lt;p&gt;Here's what the main check loop looks like (simplified for readability):&lt;/p&gt;

&lt;p&gt;async def check_endpoint(url): try: async with aiohttp.ClientSession() as session: start = time.monotonic() async with session.get(url, timeout=aiohttp.ClientTimeout(10)) as r: elapsed = int((time.monotonic() - start) * 1000) return {"is_up": True, "response_time": elapsed, "status": r.status} except (asyncio.TimeoutError, aiohttp.ClientError): return {"is_up": False, "response_time": None, "status": None}&lt;/p&gt;

&lt;p&gt;The async loop runs every minute for Pro users, every 5 minutes for free users. That's about 10,000 checks per day on a single $6 Hetzner VPS without breaking a sweat.&lt;/p&gt;

&lt;p&gt;Why SQLite is enough for a SaaS product&lt;/p&gt;

&lt;p&gt;Everyone told me I needed PostgreSQL. I ignored them and used SQLite. Here's why it works:&lt;/p&gt;

&lt;p&gt;No separate database server to manage. No connection pooling config. No backup scripts. SQLite lives in a single file that I can back up with a simple cron job.&lt;/p&gt;

&lt;p&gt;SQLite handles about 50 concurrent writes per second. For a monitoring tool where each check is a single INSERT and the dashboard does a handful of SELECTs, that's more than enough. The bottleneck is always the HTTP checks, not the database.&lt;/p&gt;

&lt;p&gt;One thing to watch out for: by default, SQLite uses a rollback journal where reads block writes and vice versa. Enable WAL mode to fix this. I set it on startup:&lt;/p&gt;

&lt;p&gt;PRAGMA journal_mode = WAL; PRAGMA busy_timeout = 5000;&lt;/p&gt;

&lt;p&gt;That's it. I've been running this in production for weeks. No locks, no corruption, no issues. I'll switch to Postgres when I have 100+ concurrent users — not before.&lt;/p&gt;

&lt;p&gt;Telegram bot for alerts in 15 lines&lt;/p&gt;

&lt;p&gt;Instead of building an email notification system that would end up in spam folders, I used a Telegram bot. It's absurdly simple:&lt;/p&gt;

&lt;p&gt;Your bot: send a POST request to api.telegram.org/bot{token}/sendMessage with chat_id and text. That's it.&lt;/p&gt;

&lt;p&gt;The alert function in my code (simplified):&lt;/p&gt;

&lt;p&gt;async def send_alert(chat_id, endpoint_name, error): message = f"🔴 {endpoint_name} is DOWN\nError: {error}" url = f"&lt;a href="https://api.telegram.org/bot%7BTELEGRAM_TOKEN%7D/sendMessage" rel="noopener noreferrer"&gt;https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage&lt;/a&gt;" payload = {"chat_id": chat_id, "text": message} async with aiohttp.ClientSession() as session: async with session.post(url, json=payload) as resp: return resp.status == 200&lt;/p&gt;

&lt;p&gt;Users connect their Telegram within 30 seconds. No SMTP config, no deliverability issues, no spam filters.&lt;/p&gt;

&lt;p&gt;What I wish I knew before starting&lt;/p&gt;

&lt;p&gt;FastAPI + SQLite + Telegram Bot is a powerful combo for solo developers. Three things I'd tell my past self:&lt;/p&gt;

&lt;p&gt;Keep the schema simple. I started with three tables and expanded when needed. Premature optimization is dangerous when you're still figuring out what your product actually needs.&lt;/p&gt;

&lt;p&gt;Don't fight async. Everything from the HTTP checks to the database calls should be async from the start. Converting sync to async later is painful.&lt;/p&gt;

&lt;p&gt;Ship the simple version first. My V1 was a single Python file with 200 lines. It worked. The current version has proper structure and error handling, but the core logic hasn't changed.&lt;/p&gt;

&lt;p&gt;The whole thing runs on a $6 Netcup VPS behind a Caddy reverse proxy with automatic SSL. &lt;/p&gt;

&lt;p&gt;If you're building something similar or have questions about the stack, I'm happy to help.&lt;/p&gt;

&lt;p&gt;PingMon is live at pingmon.ai if you want to see it in action — free tier available.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;Dario &lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built a SaaS without being a developer. Here's how it actually works.</title>
      <dc:creator>Dario Leone</dc:creator>
      <pubDate>Mon, 08 Jun 2026 11:50:41 +0000</pubDate>
      <link>https://dev.to/dario_le/i-built-a-saas-without-being-a-developer-heres-how-it-actually-works-17kn</link>
      <guid>https://dev.to/dario_le/i-built-a-saas-without-being-a-developer-heres-how-it-actually-works-17kn</guid>
      <description>&lt;p&gt;I'm a 25 year old machine technician from Germany. Nine years of metal processing. No CS degree. No bootcamp.&lt;/p&gt;

&lt;p&gt;I tried learning to code for years. Did every tutorial. Started courses. Never finished a single one. Every time I hit a wall, I stopped.&lt;/p&gt;

&lt;p&gt;Then something clicked a few weeks ago.&lt;/p&gt;

&lt;p&gt;I stopped trying to become a developer. I started trying to build a product.&lt;/p&gt;

&lt;p&gt;What I did instead:&lt;/p&gt;

&lt;p&gt;I set up an AI agent (Hermes) for architecture, research and planning — and paired it with Claude Code for implementation. My role became: product decisions, testing, deploying. Not typing.&lt;/p&gt;

&lt;p&gt;The result after 4 weeks: PingMon (pingmon.ai) — an API monitoring tool that's live, working, and slowly getting traffic.&lt;/p&gt;

&lt;p&gt;Tech stack (all chosen by AI, reviewed by me):&lt;br&gt;
Python 3.11 / FastAPI&lt;br&gt;
SQLite&lt;br&gt;
Vanilla HTML + CSS + JS (no framework)&lt;br&gt;
Stripe for payments&lt;br&gt;
Docker / docker-compose&lt;br&gt;
Caddy for reverse proxy + SSL&lt;br&gt;
Netcup VPS&lt;br&gt;
Umami Analytics&lt;/p&gt;

&lt;p&gt;What it does: Pings APIs and websites every minute. Alerts via Telegram, Slack or Email when something breaks. Includes SSL monitoring, domain expiry tracking, and a public status page. Free tier available. Paid from 12€/month.&lt;/p&gt;

&lt;p&gt;What I actually did:&lt;/p&gt;

&lt;p&gt;Designed the architecture (what goes where, which tech fits)&lt;br&gt;
Wrote the prompts that generated the code&lt;br&gt;
Set up the server, DNS, domain, SSL — myself&lt;br&gt;
Tested every feature before launch&lt;br&gt;
Handled the bugs, the crashes, the "why won't this deploy" moments&lt;br&gt;
Made all product decisions — pricing, features, UX&lt;br&gt;
Deployed at 3am after a family wedding. While everyone was dancing. Also yes.&lt;/p&gt;

&lt;p&gt;What I didn't do:&lt;/p&gt;

&lt;p&gt;Write most of the code&lt;br&gt;
Know the frameworks beforehand&lt;br&gt;
Have an exit plan&lt;br&gt;
What I learned:&lt;/p&gt;

&lt;p&gt;Having an idea. Planning it out. Building it. Making it real.&lt;/p&gt;

&lt;p&gt;But the most important thing I learned: I actually love building this. The process. The decisions. Solving problems.&lt;/p&gt;

&lt;p&gt;That feeling alone makes it worth it. I started this as an experiment. I'm continuing because it's the first thing in years that truly fulfills me.&lt;/p&gt;

&lt;p&gt;Why I'm posting this:&lt;/p&gt;

&lt;p&gt;I see questions every week: "Can I build something if I can't code?" or "Is AI-assisted development real or a scam?"&lt;/p&gt;

&lt;p&gt;This is my honest answer: yes, you can ship a working product. But you need to understand the system, not just copy-paste prompts. You need to know what you want, test it, and fix it when it breaks.&lt;/p&gt;

&lt;p&gt;I'm not here to sell you PingMon. I want honest feedback from experienced devs: does this setup count as building a product? What am I missing?&lt;/p&gt;

&lt;p&gt;I know this is a controversial topic. Some will say it doesn't count. Others will say this is exactly how building works now. I want to hear both sides.&lt;/p&gt;

&lt;p&gt;I'll answer everything. Including the hard questions.&lt;/p&gt;

&lt;p&gt;pingmon.ai&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>saas</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
