<?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: Mashhood Ali</title>
    <description>The latest articles on DEV Community by Mashhood Ali (@mashhood2019).</description>
    <link>https://dev.to/mashhood2019</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4234519%2F6d43f7e3-2c87-46e3-9cfa-070f37edefd7.png</url>
      <title>DEV Community: Mashhood Ali</title>
      <link>https://dev.to/mashhood2019</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mashhood2019"/>
    <language>en</language>
    <item>
      <title>One Small Program Every Day, No Filler, No Excuses</title>
      <dc:creator>Mashhood Ali</dc:creator>
      <pubDate>Mon, 09 Nov 2026 09:19:06 +0000</pubDate>
      <link>https://dev.to/mashhood2019/one-small-program-every-day-no-filler-no-excuses-55f4</link>
      <guid>https://dev.to/mashhood2019/one-small-program-every-day-no-filler-no-excuses-55f4</guid>
      <description>&lt;p&gt;I had a problem that will sound familiar. I kept starting big projects and finishing none of them. A huge idea on Monday, an empty repo by Friday. The green squares on my contribution graph stayed empty, and nothing I had built was something I could show anyone.&lt;/p&gt;

&lt;p&gt;So I changed the rule. Instead of one big thing, I would build one small real program every day. Alternating days: one day C++, one day Python. One commit a day, no filler commits, no empty files. Every program has to actually work and be something a person could use.&lt;/p&gt;

&lt;p&gt;That became two repos. cpp-foundry for the C++ days, py-foundry for the Python days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The C++ days
&lt;/h2&gt;

&lt;p&gt;Day one was a grade calculator. You enter your courses with credits and marks, and it prints each course with its grade points and your semester average.&lt;/p&gt;

&lt;p&gt;Day three was Two Sum, the classic interview problem. Given an array of numbers and a target, find the two numbers that add up to the target and return their positions. I solved it in one pass with a hash map. For each number, check if the target minus that number was already seen. Time O(n), space O(n). The brute-force double loop is O(n squared), and I left that behind on purpose.&lt;/p&gt;

&lt;p&gt;Day five was the LRU Cache. A fixed-capacity cache that evicts the least recently used item. I built it with a doubly linked list for the use order plus a hash map pointing at each node, so get and put both run in O(1) time. It is the kind of problem that shows up in real interviews and real systems work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Python days
&lt;/h2&gt;

&lt;p&gt;Day two was a grade calculator in Python. Enter your previous average and credits, then your courses with credits and marks, and it prints each course with its grade points, your semester average, and your new overall average. It works for any semester.&lt;/p&gt;

&lt;p&gt;Day four was a log analyzer. It reads a web server access log and prints an operations summary: total requests, unique IPs, status code breakdown, busiest IPs and paths, and the error rate. Lines that do not parse are counted and skipped instead of crashing the run. Standard library only, no dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run them
&lt;/h2&gt;

&lt;p&gt;The C++ programs compile the usual way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ two_sum.cpp &lt;span class="nt"&gt;-o&lt;/span&gt; two_sum
./two_sum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Python tools run directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 log_analyzer.py sample.log
python3 log_analyzer.py access.log &lt;span class="nt"&gt;--top&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What the streak taught me
&lt;/h2&gt;

&lt;p&gt;A small finished program beats a big unfinished idea every single time. One commit a day sounds easy until you try to keep it up. The rule that saved me was the "real program" rule. If it does not do something useful, it does not count. No placeholder files, no empty commits just to colour a square green.&lt;/p&gt;

&lt;p&gt;The streak is still going. One small program, every day.&lt;/p&gt;

&lt;p&gt;Repos: &lt;a href="https://github.com/MASHHOOD2019/cpp-foundry" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/cpp-foundry&lt;/a&gt; and &lt;a href="https://github.com/MASHHOOD2019/py-foundry" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/py-foundry&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>python</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Smallest App I Have Ever Built, and the One I Actually Open Every Day</title>
      <dc:creator>Mashhood Ali</dc:creator>
      <pubDate>Mon, 09 Nov 2026 09:14:23 +0000</pubDate>
      <link>https://dev.to/mashhood2019/the-smallest-app-i-have-ever-built-and-the-one-i-actually-open-every-day-2e3h</link>
      <guid>https://dev.to/mashhood2019/the-smallest-app-i-have-ever-built-and-the-one-i-actually-open-every-day-2e3h</guid>
      <description>&lt;p&gt;Every to-do app I tried wanted something from me. An account. An email. A sync service. A subscription for the feature that lets you delete a task. I did not want any of that. I wanted to write a task down in a terminal and have it still be there tomorrow.&lt;/p&gt;

&lt;p&gt;So I built To-Do CLI. It is the smallest app I have ever built, and it is the one I actually open every day.&lt;/p&gt;

&lt;p&gt;It is a small command line app in C++. Add tasks, list them, mark them done, delete them. That is the whole feature list, and that is enough. The tasks are saved to a file called &lt;code&gt;tasks.txt&lt;/code&gt;, so they persist between runs. You close the terminal, you come back tomorrow, your list is still there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;The app is built around a simple Task class and file handling in C++. Add a task and it goes on the list as pending. List all tasks and you see each one with its status, pending or done. Mark a task done when you finish it. Delete a task when you do not need it anymore. Nothing else. No categories, no tags, no priorities, no cloud.&lt;/p&gt;

&lt;p&gt;I kept it small on purpose. A to-do list is not a project management platform. The moment it grows a login screen, it has failed at its job.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ TodoCLI.cpp &lt;span class="nt"&gt;-o&lt;/span&gt; todo
./todo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is it. One file, one compile, no dependencies, no install step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I still use it
&lt;/h2&gt;

&lt;p&gt;I have built bigger things since. Dashboards, APIs, monitors. But this little tool is the one that taught me something useful: the best version of a tool is often the smallest one that still does the job. If a program does one thing and does it without getting in your way, you will keep using it. If it asks you to sign up first, you will not.&lt;/p&gt;

&lt;p&gt;If you are learning C++ and you want a first project that is actually useful, a to-do CLI is a good place to start. File handling, a small class, a menu loop. Nothing fancy, and you end up with something you open every morning.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/MASHHOOD2019/todo-cli" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/todo-cli&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>cli</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Bug Reports Kept Arriving as Messy Chats, So I Built a Tracker That Fits in One Page</title>
      <dc:creator>Mashhood Ali</dc:creator>
      <pubDate>Mon, 09 Nov 2026 09:09:43 +0000</pubDate>
      <link>https://dev.to/mashhood2019/bug-reports-kept-arriving-as-messy-chats-so-i-built-a-tracker-that-fits-in-one-page-3ji9</link>
      <guid>https://dev.to/mashhood2019/bug-reports-kept-arriving-as-messy-chats-so-i-built-a-tracker-that-fits-in-one-page-3ji9</guid>
      <description>&lt;p&gt;When I started doing QA testing, I noticed something fast. Bugs did not arrive as bug reports. They arrived as chat messages. "The login is broken." No severity. No steps to reproduce. No expected result, no actual result. Nothing a developer could act on, and nothing I could hand to a client as proof of the work.&lt;/p&gt;

&lt;p&gt;I wanted a proper tracker, but the real ones all wanted accounts, servers, and subscriptions. I was testing small things. I needed something I could open and use in ten seconds.&lt;/p&gt;

&lt;p&gt;So I built QA Bug Tracker. A complete bug-tracking tool for manual QA work. Report defects with severity and steps to reproduce, triage by filter and search, track the fix rate, and export the report as JSON or CSV. No server, no install, no framework. Just open the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;A bug has the fields a real report needs. Severity, module, steps to reproduce, expected result versus actual result. The lifecycle is simple: report, open, fixed, reopen, plus delete.&lt;/p&gt;

&lt;p&gt;Triage is built in. Live search, a severity filter, and a status filter narrow the list as you type. The stats update as bugs change: total bugs, open count, critical-open count, and fix rate percentage.&lt;/p&gt;

&lt;p&gt;The export is the part I cared about most. One click gives you a JSON or CSV report, the format a QA tester actually hands to a developer or a client. That was the whole point. A chat message is not a deliverable. A report is.&lt;/p&gt;

&lt;p&gt;Everything persists in &lt;code&gt;localStorage&lt;/code&gt;, so bugs survive a refresh. On first run, three realistic sample bugs are seeded so the workflow is visible immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it
&lt;/h2&gt;

&lt;p&gt;Just open &lt;code&gt;index.html&lt;/code&gt; in a browser. No server, no install, no build step. It works offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The severity guide
&lt;/h2&gt;

&lt;p&gt;The tracker uses four levels, and I wrote the guide into it because new testers always ask what counts as what.&lt;/p&gt;

&lt;p&gt;Critical blocks core use, like a login button that does nothing. Major means a feature is broken but a workaround exists, like a discount code being ignored. Minor is visual or non-blocking, like a footer overlapping content. Trivial is cosmetic polish, like a typo in a label.&lt;/p&gt;

&lt;p&gt;Getting severity right matters more than people think. A report with five "critical" bugs, where four are typos, teaches the developer to ignore you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would add next
&lt;/h2&gt;

&lt;p&gt;Screenshot attachments on bug reports, assignee and due-date fields, and importing a previously exported JSON report back into the tracker. For now it does the core job, and it does it without asking you to sign up for anything.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/MASHHOOD2019/qa-bug-tracker" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/qa-bug-tracker&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>qa</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Did Not Trust the Cloud With My Passwords, So I Built a Vault That Never Leaves My Machine</title>
      <dc:creator>Mashhood Ali</dc:creator>
      <pubDate>Mon, 09 Nov 2026 09:04:55 +0000</pubDate>
      <link>https://dev.to/mashhood2019/i-did-not-trust-the-cloud-with-my-passwords-so-i-built-a-vault-that-never-leaves-my-machine-3j0</link>
      <guid>https://dev.to/mashhood2019/i-did-not-trust-the-cloud-with-my-passwords-so-i-built-a-vault-that-never-leaves-my-machine-3j0</guid>
      <description>&lt;p&gt;I have a lot of logins. Like everyone else, I kept them in my head, then in a text file, then nowhere safe at all. Every password manager I looked at wanted a cloud account and a subscription. I did not want my secrets sitting on someone else's server. I wanted them on my own machine, encrypted properly, with nothing leaving the device.&lt;/p&gt;

&lt;p&gt;So I built Secure Vault. An encrypted credential store that runs entirely locally. No cloud account, no server, nothing leaves the device.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it keeps things safe
&lt;/h2&gt;

&lt;p&gt;The encryption is real. Fernet, which is AES-128-CBC plus HMAC, through the &lt;code&gt;cryptography&lt;/code&gt; package. No home-grown ciphers, no clever shortcuts. The key comes from your master password through PBKDF2-HMAC-SHA256 with 600,000 iterations and a random 16-byte salt per vault. That makes brute-force attacks expensive, and identical passwords produce different keys.&lt;/p&gt;

&lt;p&gt;The master password is never stored anywhere. Not hashed, not anywhere. The encrypted data itself is the check. A wrong password simply fails decryption. The vault file is created with owner-only permissions, so other users on the machine cannot read it. And passwords are read with &lt;code&gt;getpass&lt;/code&gt;, so they never show up in shell history or process arguments.&lt;/p&gt;

&lt;p&gt;If you leave the password blank when adding an entry, the vault generates a strong 20-character password for you from the &lt;code&gt;secrets&lt;/code&gt; module.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;It is a command line tool with a full entry lifecycle. Create a vault, add entries, read one back, list entry names, delete an entry. Listing never shows secrets, only names.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python vault.py init          &lt;span class="c"&gt;# create vault, set master password&lt;/span&gt;
python vault.py add github    &lt;span class="c"&gt;# store an entry (prompts for details)&lt;/span&gt;
python vault.py get github    &lt;span class="c"&gt;# show one entry&lt;/span&gt;
python vault.py list          &lt;span class="c"&gt;# list entry names (never secrets)&lt;/span&gt;
python vault.py delete github &lt;span class="c"&gt;# remove an entry&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The honest limits
&lt;/h2&gt;

&lt;p&gt;It is a single machine, single user tool. There is no sync, no sharing, and no recovery. If you forget the master password, the vault cannot be opened, by design. There is no back door and no reset link. That is the trade you make for keeping everything offline.&lt;/p&gt;

&lt;p&gt;I tested the full round trip before I trusted it. Create, add, read back, the exact entry comes back. A wrong master password is rejected. Delete removes the entry. An empty vault says so plainly.&lt;/p&gt;

&lt;p&gt;If you want your passwords encrypted and nowhere else, this does the job.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/MASHHOOD2019/secure-vault" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/secure-vault&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>opensource</category>
      <category>cli</category>
    </item>
    <item>
      <title>I Built a Tiny Telemetry System Because the Real Ones Need a Server Farm</title>
      <dc:creator>Mashhood Ali</dc:creator>
      <pubDate>Mon, 09 Nov 2026 08:59:42 +0000</pubDate>
      <link>https://dev.to/mashhood2019/i-built-a-tiny-telemetry-system-because-the-real-ones-need-a-server-farm-110c</link>
      <guid>https://dev.to/mashhood2019/i-built-a-tiny-telemetry-system-because-the-real-ones-need-a-server-farm-110c</guid>
      <description>&lt;p&gt;I have always liked the idea of telemetry. Devices out in the world, quietly posting readings, and a dashboard somewhere showing what is happening right now. Temperature, pressure, vibration. Simple numbers, but they tell you a lot.&lt;/p&gt;

&lt;p&gt;The problem was that every real telemetry stack I looked at wanted a server farm. A message broker, a time-series database, a cluster, a cloud account. I did not have any of that. I had a laptop and an evening.&lt;/p&gt;

&lt;p&gt;So I built a small one. A local telemetry ingestion system. Devices POST sensor readings to a REST API, the readings land in SQLite, and a dashboard shows live stats, per-sensor trends, and recent readings. It is the kind of data-logging tool used in industrial operations support, just shrunk down to something one person can run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;The API takes a reading with a sensor id, a value, a unit, and a timestamp, validates it, and stores it. Bad input gets rejected with a 422, so junk never reaches the database.&lt;/p&gt;

&lt;p&gt;The dashboard is served by the API itself. It has stats cards, a per-sensor trend chart, and a recent-readings table, and it refreshes every 3 seconds. There is a statistics endpoint too, totals, per-sensor minimum, maximum and average, and the latest value per sensor, all aggregated in SQL.&lt;/p&gt;

&lt;p&gt;There is also a sensor simulator. It generates realistic temperature, pressure, and vibration traffic and posts it every 2 seconds, so you can watch the dashboard move without wiring up a real device. That part turned out to be the most fun. You run it in a second terminal and the whole thing comes alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
uvicorn app.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://127.0.0.1:8000" rel="noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt; for the dashboard. The API docs live at &lt;a href="http://127.0.0.1:8000/docs" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/docs&lt;/a&gt;, FastAPI generates them for free.&lt;/p&gt;

&lt;p&gt;To make demo traffic, open a second terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python simulator.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also post a reading by hand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://127.0.0.1:8000/api/readings &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"sensor_id": "temp-01", "value": 71.5, "unit": "C"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It answers with the id of the stored reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it is put together
&lt;/h2&gt;

&lt;p&gt;The stack is Python 3.12, FastAPI, and Pydantic validation on the API side, SQLite indexed on sensor and timestamp for storage, and plain HTML, CSS, and vanilla JavaScript with a Canvas chart on the front end. The server is Uvicorn. The simulator uses httpx.&lt;/p&gt;

&lt;p&gt;Nothing here is clever. That was the point. A sensor posts a number, the number gets stored, the dashboard shows it. If you have ever wanted to see your own data flowing end to end, this is a good place to start.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/MASHHOOD2019/telemetry-logger" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/telemetry-logger&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>iot</category>
      <category>opensource</category>
    </item>
    <item>
      <title>My Own Tool Failed on My Own Laptop, and Windows Was the Problem</title>
      <dc:creator>Mashhood Ali</dc:creator>
      <pubDate>Mon, 09 Nov 2026 08:44:05 +0000</pubDate>
      <link>https://dev.to/mashhood2019/my-own-tool-failed-on-my-own-laptop-and-windows-was-the-problem-3o37</link>
      <guid>https://dev.to/mashhood2019/my-own-tool-failed-on-my-own-laptop-and-windows-was-the-problem-3o37</guid>
      <description>&lt;p&gt;I built Windows Toolbox to do the jobs every Windows user needs sooner or later. See system info. Clean junk files. Remove preinstalled bloatware. Manage startup apps. Install essential free software. One menu, plain text, nothing hidden.&lt;/p&gt;

&lt;p&gt;Then I ran it on my own Windows 11 laptop. I typed &lt;code&gt;python toolbox.py&lt;/code&gt;, and the shell told me Python was not found and sent me to the Microsoft Store.&lt;/p&gt;

&lt;p&gt;The tool was fine. Windows was the problem. On Windows 11, the &lt;code&gt;python&lt;/code&gt; command gets caught by a Microsoft Store shortcut, so the real Python never runs. My own tool failed on my own laptop because of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix takes a minute
&lt;/h2&gt;

&lt;p&gt;Try these in order.&lt;/p&gt;

&lt;p&gt;First, run &lt;code&gt;py toolbox.py&lt;/code&gt; instead. The &lt;code&gt;py&lt;/code&gt; launcher usually skips the Store shortcut, and the menu just opens.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;py&lt;/code&gt; also fails, Python is not installed at all. Install it from python.org, and on the first install screen tick the box that says "Add python.exe to PATH". Then close the shell, open a new one, and try again.&lt;/p&gt;

&lt;p&gt;If Python is installed but &lt;code&gt;python&lt;/code&gt; still opens the Store, go to Settings, then Apps, then Advanced app settings, then App execution aliases, and turn OFF &lt;code&gt;python.exe&lt;/code&gt; and &lt;code&gt;python3.exe&lt;/code&gt;. That kills the shortcut and lets the real Python run.&lt;/p&gt;

&lt;p&gt;I put the full fix in the repo README too, so the next person does not lose an evening to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the tool does
&lt;/h2&gt;

&lt;p&gt;It is a free, open-source Windows utility in plain Python, standard library only, no third-party packages needed. Pick a number from the menu.&lt;/p&gt;

&lt;p&gt;System information shows OS, CPU, RAM usage, uptime, and free disk space. Disk cleanup removes temp files and optionally empties the Recycle Bin. The bloatware remover lists well-known preinstalled third-party apps, Candy Crush, Disney+, Netflix, Spotify, TikTok, and more, and removes only the ones you pick. Startup apps lists what launches at boot, disables them with a backup, and restores them later. The installer grabs popular free software like Chrome, VS Code, VLC, 7-Zip, and Git through winget.&lt;/p&gt;

&lt;p&gt;Nothing is deleted, removed, or changed without showing you exactly what will happen and asking first. The debloat list only covers well-known preinstalled third-party apps, never system apps. Disabled startup items are backed up so they can be restored.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it
&lt;/h2&gt;

&lt;p&gt;You need Windows 10 or 11 and Python 3.10 or newer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python toolbox.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pick a number from the menu. Every destructive action asks for confirmation first.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/MASHHOOD2019/windows-toolbox" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/windows-toolbox&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>windows</category>
      <category>opensource</category>
      <category>tools</category>
    </item>
    <item>
      <title>I Got Tired of Finding Out My Sites Were Down From Other People</title>
      <dc:creator>Mashhood Ali</dc:creator>
      <pubDate>Mon, 09 Nov 2026 08:42:56 +0000</pubDate>
      <link>https://dev.to/mashhood2019/i-got-tired-of-finding-out-my-sites-were-down-from-other-people-25g2</link>
      <guid>https://dev.to/mashhood2019/i-got-tired-of-finding-out-my-sites-were-down-from-other-people-25g2</guid>
      <description>&lt;p&gt;A while back, one of my small sites went down. I did not notice. Nobody told me for hours. A friend messaged me about it eventually, and that was the moment I realised I had no monitoring at all.&lt;/p&gt;

&lt;p&gt;I looked at the hosted options. They all wanted a monthly fee, or an account, or a server I had to rent. I did not need any of that. I needed something that checks a URL every minute and tells me when it stops answering.&lt;/p&gt;

&lt;p&gt;So I built Watchdog.&lt;/p&gt;

&lt;p&gt;It is a lightweight uptime monitor that runs on your own machine. You add your websites, it checks them on a schedule, keeps the full history, shows a live dashboard, and pings you on Telegram or email the moment something goes down or comes back up. No Docker. No server to rent. No heavy dependencies. Just Python, FastAPI, and SQLite.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;It monitors any HTTP or HTTPS URL on a schedule you choose, every 60 seconds by default. Every check is recorded: status code, response time, up or down, timestamp.&lt;/p&gt;

&lt;p&gt;The dashboard shows per-site status cards, uptime percentages for the last 24 hours, 7 days and 30 days, response-time sparklines, and a recent event log. It polls the API every 15 seconds, so the page stays live.&lt;/p&gt;

&lt;p&gt;One thing I was careful about: a site is only marked DOWN after a few consecutive failures. A single slow response should not page you at midnight. You can also pause or resume any site, or delete a site along with its full history.&lt;/p&gt;

&lt;p&gt;Alerts are optional. Without them, Watchdog still monitors everything and logs state changes to the dashboard. With them, you get a Telegram or email message the moment a site flips from UP to DOWN, and again when it comes back.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it
&lt;/h2&gt;

&lt;p&gt;You need Python 3.10 or newer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/MASHHOOD2019/watchdog.git
&lt;span class="nb"&gt;cd &lt;/span&gt;watchdog
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt; in your browser and add your first URL in the form at the top. On Windows you can run it the same way from a terminal, or wrap it in a small &lt;code&gt;.bat&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;To turn on Telegram alerts, copy &lt;code&gt;config.example.json&lt;/code&gt; to &lt;code&gt;config.json&lt;/code&gt; and fill in your bot token and chat id. For email, fill in the SMTP details in the same file. Restart the app and you are done.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;A background thread checks every enabled site on its own schedule using the standard library, so there is nothing extra to install for the checking itself. Results go into a local SQLite database, one row per check, plus an event row on every state change. FastAPI serves both the dashboard and a small JSON API that the page polls.&lt;/p&gt;

&lt;p&gt;The whole thing is one small codebase. &lt;code&gt;app.py&lt;/code&gt; is the entry point, &lt;code&gt;checker.py&lt;/code&gt; runs the background checks, &lt;code&gt;db.py&lt;/code&gt; handles storage, &lt;code&gt;alerts.py&lt;/code&gt; delivers Telegram and email. That is it.&lt;/p&gt;

&lt;p&gt;If you run any small sites and you are still finding out about downtime from other people, this is for you.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/MASHHOOD2019/watchdog" rel="noopener noreferrer"&gt;https://github.com/MASHHOOD2019/watchdog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>monitoring</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
