<?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: Nishal K</title>
    <description>The latest articles on DEV Community by Nishal K (@nishal21).</description>
    <link>https://dev.to/nishal21</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%2F3760349%2F52bcda7b-73d7-4ecb-bda7-efd7c745aeb9.jpeg</url>
      <title>DEV Community: Nishal K</title>
      <link>https://dev.to/nishal21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nishal21"/>
    <language>en</language>
    <item>
      <title>My GitHub profile sings now, and you can add a line to the song</title>
      <dc:creator>Nishal K</dc:creator>
      <pubDate>Fri, 16 Oct 2026 14:36:45 +0000</pubDate>
      <link>https://dev.to/nishal21/my-github-profile-sings-now-and-you-can-add-a-line-to-the-song-3cmk</link>
      <guid>https://dev.to/nishal21/my-github-profile-sings-now-and-you-can-add-a-line-to-the-song-3cmk</guid>
      <description>&lt;p&gt;My GitHub profile has two songs on it now. One is made from my own contribution graph. The other is made by whoever stops by, and right now it's one verse long. I'd like it to be longer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Song one: my commits as a beat
&lt;/h2&gt;

&lt;p&gt;Every night a GitHub Action reads my contribution calendar and turns the last 12 months into a 90-second track. Each bar is one week of the calendar, and the lyrics come from the same numbers, so when my stats change the song changes too.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://nishal21.github.io/nishal21/player/" rel="noopener noreferrer"&gt;player&lt;/a&gt; shows the beat grid as it plays. You can also open the remix panel, mute parts, change the tempo and share your mix as a link. There's a 45-second &lt;a href="https://nishal21.github.io/nishal21/video/trailer/?embed=1" rel="noopener noreferrer"&gt;year trailer&lt;/a&gt; cut on the beat of the same song.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv2lw1xaq5wmsda4n7vs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv2lw1xaq5wmsda4n7vs.png" alt="Contribution song card" width="495" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Song two: the visitor song
&lt;/h2&gt;

&lt;p&gt;This is the one I posted about on X. You open an issue from a short form, pick a note and an instrument (everything is in A minor, so any note fits), and if you want, write up to two lyric lines of 60 characters each. That night a script adds your note to the track, puts your lines into the lyrics and credits them to your @username. The song gets a little longer every time someone joins.&lt;/p&gt;

&lt;p&gt;You get a comment on your issue with a link to the exact second your part plays. You also get your own poster in four sizes (wide, feed, square and story), each with a QR code that starts the song at your line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnishal21%2Fnishal21%2Freleases%2Fdownload%2Fvisitor-posters-1%2F2-feed.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnishal21%2Fnishal21%2Freleases%2Fdownload%2Fvisitor-posters-1%2F2-feed.jpg" alt="A visitor poster" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The lyrics play as a lyric video in the browser on the &lt;a href="https://nishal21.github.io/nishal21/video/visitor/?embed=1" rel="noopener noreferrer"&gt;video page&lt;/a&gt;, and the same video is rendered to an MP4 and attached to a release.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2111063512143561055-49" src="https://platform.twitter.com/embed/Tweet.html?id=2111063512143561055"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2111063512143561055-49');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2111063512143561055&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Who sings it
&lt;/h2&gt;

&lt;p&gt;The vocals come from &lt;a href="https://github.com/ace-step/ACE-Step-1.5" rel="noopener noreferrer"&gt;ACE-Step 1.5&lt;/a&gt; by ACE Studio and StepFun (Apache-2.0). The workflow tries &lt;a href="https://acemusic.ai" rel="noopener noreferrer"&gt;acemusic.ai&lt;/a&gt; first. If that fails, it runs ACE-Step on the GitHub Actions runner's CPU. If both fail, the last good take stays up, so the page never ends up with a broken song.&lt;/p&gt;

&lt;p&gt;AI singers mumble, so every take gets checked. faster-whisper transcribes the vocals and compares them to the lyrics, and a take with missing or repeated lines gets thrown out. Then Demucs separates the vocals so I can mix them louder than the music and you can make out the words. The &lt;a href="https://github.com/nishal21/nishal21/blob/main/assets/visitor-song-lyrics.md" rel="noopener noreferrer"&gt;lyrics page&lt;/a&gt; says which voice sang that night's take.&lt;/p&gt;

&lt;p&gt;Today the backup CPU voice did it, because acemusic.ai was overloaded. It took a while, but it worked, and that's why the fallback is there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The player
&lt;/h2&gt;

&lt;p&gt;The player has four looks you can switch between: Vinyl, Poster, Editorial and Sketch. The doodles around it are from &lt;a href="https://www.opendoodles.com/" rel="noopener noreferrer"&gt;Open Doodles&lt;/a&gt;, which are CC0.&lt;/p&gt;

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

&lt;p&gt;Nothing. It all runs on free GitHub Actions and GitHub Pages. The MP3s, MP4s and posters go into releases instead of the git history, so the repo stays small even though it renders audio and video every night.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add your line
&lt;/h2&gt;

&lt;p&gt;The song is short because hardly anyone has added to it yet. Pick a note, write a line if you feel like it, and your name goes in the credits tonight:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/nishal21/nishal21/issues/new?template=visitor-note.yml" rel="noopener noreferrer"&gt;Add a note to the visitor song&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One note per person per week. Keep it kind. You can &lt;a href="https://nishal21.github.io/nishal21/player/?song=visitor" rel="noopener noreferrer"&gt;listen to the current take&lt;/a&gt; first, and the code is all in &lt;a href="https://github.com/nishal21/nishal21" rel="noopener noreferrer"&gt;nishal21/nishal21&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>github</category>
      <category>showdev</category>
      <category>githubactions</category>
      <category>music</category>
    </item>
    <item>
      <title>I built a full-screen news reader that lives in the terminal</title>
      <dc:creator>Nishal K</dc:creator>
      <pubDate>Fri, 31 Jul 2026 19:11:31 +0000</pubDate>
      <link>https://dev.to/nishal21/i-built-a-full-screen-news-reader-that-lives-in-the-terminal-jmp</link>
      <guid>https://dev.to/nishal21/i-built-a-full-screen-news-reader-that-lives-in-the-terminal-jmp</guid>
      <description>&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Linux / macOS
&lt;/h3&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;worldnews-cli
worldnews
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;pip&lt;/code&gt; isn't in your PATH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;py &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;worldnews-cli
py &lt;span class="nt"&gt;-m&lt;/span&gt; worldnews
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; worldnews
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Built With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Textual&lt;/li&gt;
&lt;li&gt;feedparser&lt;/li&gt;
&lt;li&gt;Rich&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Website&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nishal21.github.io/News-CLI/" rel="noopener noreferrer"&gt;https://nishal21.github.io/News-CLI/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PyPI&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pypi.org/project/worldnews-cli/" rel="noopener noreferrer"&gt;https://pypi.org/project/worldnews-cli/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nishal21/News-CLI" rel="noopener noreferrer"&gt;https://github.com/nishal21/News-CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My Website&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nishal.dev" rel="noopener noreferrer"&gt;https://nishal.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I'd love feedback.&lt;/p&gt;

&lt;p&gt;If you try it, let me know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which terminal you're using&lt;/li&gt;
&lt;li&gt;Which operating system&lt;/li&gt;
&lt;li&gt;Which RSS feed broke first 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pull requests, issues, and feature suggestions are always welcome.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a zero-config, 100% serverless portfolio generator so you never have to update yours again.</title>
      <dc:creator>Nishal K</dc:creator>
      <pubDate>Mon, 13 Apr 2026 06:09:53 +0000</pubDate>
      <link>https://dev.to/nishal21/i-built-a-zero-config-100-serverless-portfolio-generator-so-you-never-have-to-update-yours-again-14a1</link>
      <guid>https://dev.to/nishal21/i-built-a-zero-config-100-serverless-portfolio-generator-so-you-never-have-to-update-yours-again-14a1</guid>
      <description>&lt;p&gt;We all know the cycle. You spend weeks building an incredible side project, you push it to GitHub, and then... you realize you have to manually update your personal portfolio site. So, the project sits there, invisible to recruiters, and your portfolio slowly goes out of date.&lt;/p&gt;

&lt;p&gt;I got tired of this, so I built Publicolio.&lt;/p&gt;

&lt;p&gt;Publicolio is an open-source, zero-config generator that turns your GitHub profile into a premium, editorial-grade portfolio website instantly. No servers. No databases. No manual updates.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/nishal21" rel="noopener noreferrer"&gt;
        nishal21
      &lt;/a&gt; / &lt;a href="https://github.com/nishal21/Publicolio" rel="noopener noreferrer"&gt;
        Publicolio
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Publicolio is a zero-config GitHub portfolio generator. It lets you fetch a GitHub profile, select repositories, style the page with theme controls, and generate a shareable link.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Publicolio&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Publicolio is a zero-configuration GitHub portfolio generator
It lets you fetch profile data, curate repositories, apply visual themes, and publish a shareable portfolio URL in minutes.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/nishal21/Publicolio/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnishal21%2FPublicolio%2FHEAD%2Fdemo.gif" alt="Publicolio demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Highlights&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Fetches profile and repository data from GitHub.&lt;/li&gt;
&lt;li&gt;Supports optional personal access token input in builder mode for private or owner-only repositories.&lt;/li&gt;
&lt;li&gt;Includes 6 portfolio themes with live preview.&lt;/li&gt;
&lt;li&gt;Exposes practical editor controls for layout, typography, card style, and accent color.&lt;/li&gt;
&lt;li&gt;Encodes portfolio state into query parameters for deterministic sharing.&lt;/li&gt;
&lt;li&gt;Supports optional short links through a Cloudflare Worker.&lt;/li&gt;
&lt;li&gt;Supports short-link domain selection (&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;workers.dev&lt;/code&gt;, &lt;code&gt;custom&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Caches builder state for returning users.&lt;/li&gt;
&lt;li&gt;Supports &lt;code&gt;Update Link&lt;/code&gt; flow to preserve the same short code when backend overwrite is supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Runtime Model&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Publicolio runs in two modes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Builder mode&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Activated when &lt;code&gt;user&lt;/code&gt; and &lt;code&gt;theme&lt;/code&gt; query params are not present.&lt;/li&gt;
&lt;li&gt;Renders the interactive editor (&lt;code&gt;LandingBuilder&lt;/code&gt;) to fetch data, choose repos, style output…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nishal21/Publicolio" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;✨ The Visuals: Structural Themes&lt;br&gt;
I didn't just want to build a tool that swapped out CSS colors. I wanted themes that fundamentally changed the layout (the DOM structure) based on the developer's vibe.&lt;/p&gt;

&lt;p&gt;Right now, it ships with several high-end themes:&lt;/p&gt;

&lt;p&gt;Neo-Brutalism: High contrast, harsh borders, and bold typography.&lt;/p&gt;

&lt;p&gt;Liquid Glass: Frosted glassmorphism with overlapping translucent cards.&lt;/p&gt;

&lt;p&gt;Aurora: Glowing animated gradients and atmospheric design.&lt;/p&gt;

&lt;p&gt;Terminal: A high-fidelity "hacker" aesthetic with macOS-style window chrome.&lt;/p&gt;

&lt;p&gt;You just type in your GitHub username, pick your repositories, and generate a link.&lt;/p&gt;

&lt;p&gt;⚙️ The Architecture: Keeping it 100% Free&lt;br&gt;
The most interesting challenge of this project was figuring out how to build a dynamic tool without paying for a traditional backend or database. Here is how I architected the serverless pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Frontend (Vite + React + Tailwind v4)&lt;br&gt;
The app is a strict Single Page Application (SPA) hosted for free on GitHub Pages. It fetches your pinned and recent repositories directly from the GitHub REST API right inside the browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bypassing CORS &amp;amp; Rate Limits&lt;br&gt;
If you hit GitHub's API directly from a browser, you run into strict rate limits. If you try to fetch from other platforms (like GitLab), you get hit with CORS blocks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Solution: I built a custom, zero-cost proxy using a Cloudflare Worker. The React app routes requests through the edge worker, which safely injects CORS headers and handles optional Personal Access Tokens (PATs) so users can fetch their private repositories safely.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Database-less Shortener
When a user selects their theme and custom repositories, that data has to be saved somewhere so the generated portfolio link works when shared. Instead of a Postgres database, I encoded the user's state directly into the URL query parameters (e.g., /?user=nishal21&amp;amp;theme=brutal&amp;amp;repos=ProjectA,ProjectB).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Problem: Those URLs are ugly and too long for a resume.&lt;/p&gt;

&lt;p&gt;The Solution: I spun up a second Cloudflare Worker attached to Cloudflare KV (Key-Value storage). When you deploy your portfolio, the frontend sends the long URL to the Worker, which saves it to KV and returns a sleek, random 6-character short link.&lt;/p&gt;

&lt;p&gt;🚀 Try it out&lt;br&gt;
I built this to solve my own problem, but I made it completely open-source so anyone can use it or learn from the Cloudflare architecture.&lt;/p&gt;

&lt;p&gt;If you want to generate a portfolio for yourself in about 10 seconds, check it out!&lt;/p&gt;

&lt;p&gt;🔗 Live Generator: [&lt;a href="https://app.publicolio.qzz.io/" rel="noopener noreferrer"&gt;https://app.publicolio.qzz.io/&lt;/a&gt;]&lt;br&gt;
🐙 Source Code: [&lt;a href="https://github.com/nishal21/Publicolio" rel="noopener noreferrer"&gt;https://github.com/nishal21/Publicolio&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;I would love to hear your feedback on the code, the UI themes, or how you handle your own personal portfolios. Drop your generated links in the comments!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgfzlvw2j8lsfbsgc8qm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgfzlvw2j8lsfbsgc8qm.gif" alt=" " width="760" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>serverless</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>How I Built a Memory-Safe Steganography Engine in Rust to Protect Data from AI Scrapers</title>
      <dc:creator>Nishal K</dc:creator>
      <pubDate>Sat, 28 Mar 2026 03:29:14 +0000</pubDate>
      <link>https://dev.to/nishal21/how-i-built-a-memory-safe-steganography-engine-in-rust-to-protect-data-from-ai-scrapers-4cch</link>
      <guid>https://dev.to/nishal21/how-i-built-a-memory-safe-steganography-engine-in-rust-to-protect-data-from-ai-scrapers-4cch</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a Memory-Safe Steganography Engine in Rust to Protect Data from AI Scrapers
&lt;/h1&gt;

&lt;p&gt;As AI models scale, data provenance is becoming a massive engineering challenge. Automated web scrapers are vacuuming up datasets without any regard for creator licenses or intellectual property.&lt;/p&gt;

&lt;p&gt;I wanted to build a mathematical solution to this problem, so I architected &lt;strong&gt;Sigil&lt;/strong&gt;: a zero-knowledge cryptographic vault that embeds verifiable, HMAC-SHA256 signed ownership IDs directly into the pixels of an image.&lt;/p&gt;

&lt;p&gt;While the desktop vault (built with Tauri, Svelte, and an offline SQLite daemon) is strictly closed-source to protect the cryptographic keys, I realized that "Security by Obscurity" isn't enough. If AI companies don't know how to read the hidden IDs, they will just scrape the images anyway.&lt;/p&gt;

&lt;p&gt;So, I open-sourced the extraction layer. Here is a deep dive into how I used Rust to build a memory-safe Least Significant Bit (LSB) steganography reader.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Concept: LSB Steganography
&lt;/h3&gt;

&lt;p&gt;Every pixel in a standard image is made of Red, Green, and Blue channels. Each channel is represented by a byte (8 bits), with values ranging from 0 to 255.&lt;/p&gt;

&lt;p&gt;If you change the &lt;strong&gt;Least Significant Bit&lt;/strong&gt; (the absolute last 1 or 0 in that byte), the color change is invisible to the human eye. But mathematically, you can use those hidden bits to store a secret payload—like a 32-byte cryptographic ID.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rust Implementation
&lt;/h3&gt;

&lt;p&gt;To make this blazing fast and completely safe from memory leaks, I used Rust's &lt;code&gt;image&lt;/code&gt; crate to parse the pixels. Here is the exact open-source reference implementation for extracting the payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GenericImageView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/// Extracts a hidden Sigil Cryptographic ID from an image's LSB layer.&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;verify_steganography&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expected_id_len&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.map_err&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nf"&gt;.to_rgba8&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with_capacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected_id_len&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 1. Extract the Least Significant Bits&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pixel&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="nf"&gt;.pixels&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Iterate over R, G, B&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;expected_id_len&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// The bitwise AND operator isolates the final bit&lt;/span&gt;
                &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Reconstruct the bytes&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;extracted_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="nf"&gt;.chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.enumerate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Shift the bit back into its correct position&lt;/span&gt;
                &lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bit&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;extracted_bytes&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Return the Hex String&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;extracted_bytes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Breaking Down the Bitwise Math
&lt;/h3&gt;

&lt;p&gt;The magic happens in two specific lines of code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pixel[channel] &amp;amp; 1&lt;/code&gt;: This is a bitwise &lt;code&gt;AND&lt;/code&gt; operation. By comparing the pixel's byte against &lt;code&gt;00000001&lt;/code&gt;, we wipe out the first 7 bits and isolate only the final bit. If the pixel is even, it returns &lt;code&gt;0&lt;/code&gt;. If it is odd, it returns &lt;code&gt;1&lt;/code&gt;. We push this bit into our Vector.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;byte |= bit &amp;lt;&amp;lt; (7 - i)&lt;/code&gt;: Once we have 8 hidden bits, we need to stitch them back into a single byte. We use the left-shift operator (&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;) to push the bit into the correct slot (from position 7 down to 0), and the bitwise &lt;code&gt;OR&lt;/code&gt; operator (&lt;code&gt;|=&lt;/code&gt;) to combine them into the final &lt;code&gt;u8&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Open Standard
&lt;/h3&gt;

&lt;p&gt;By publishing this extraction logic, AI procurement teams can now integrate this exact function into their scraping pipelines. If their crawler detects a payload, they know the asset is cryptographically locked and requires an API clearance.&lt;/p&gt;

&lt;p&gt;You can check out the full open-source extraction standard on GitHub, or visit the lightning-fast Astro-powered documentation site here: &lt;br&gt;
&lt;strong&gt;&lt;a href="https://nishal21.github.io/Sigil-extractor/" rel="noopener noreferrer"&gt;https://nishal21.github.io/Sigil-extractor/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts on the Rust implementation or LSB steganography in general!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/nishal21/Sigil-extractor" rel="noopener noreferrer"&gt;https://github.com/nishal21/Sigil-extractor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webdev</category>
      <category>ai</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>I built an open-source, Neo-Brutalist network diagnostic tool (React + Python CLI)</title>
      <dc:creator>Nishal K</dc:creator>
      <pubDate>Fri, 27 Mar 2026 13:57:31 +0000</pubDate>
      <link>https://dev.to/nishal21/i-built-an-open-source-neo-brutalist-network-diagnostic-tool-react-python-cli-2gbg</link>
      <guid>https://dev.to/nishal21/i-built-an-open-source-neo-brutalist-network-diagnostic-tool-react-python-cli-2gbg</guid>
      <description>&lt;p&gt;Have you ever been frustrated by standard internet speed tests? They are often cluttered with ads, provide zero real context on what your raw speed actually &lt;em&gt;means&lt;/em&gt; for your daily use, and force you to leave your terminal.&lt;/p&gt;

&lt;p&gt;I wanted to fix that. So, I built &lt;strong&gt;SpedFind&lt;/strong&gt;: a pro-grade, open-source network diagnostic tool. I designed it to cater to both visual users and terminal power users by building two distinct interfaces. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/nishal21" rel="noopener noreferrer"&gt;
        nishal21
      &lt;/a&gt; / &lt;a href="https://github.com/nishal21/SpedFind" rel="noopener noreferrer"&gt;
        SpedFind
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A highly accurate, free, and open-source internet speed test tool featuring a stunning Neo-Brutalist Cyber-HUD and a beautiful Terminal Dashboard.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🚀 SPEDFIND.&lt;/h1&gt;
&lt;/div&gt;
  &lt;p&gt;&lt;b&gt;Pro-Grade Network Diagnostics &amp;amp; Telemetry&lt;/b&gt;&lt;/p&gt;
  &lt;p&gt;A highly accurate, free, and open-source internet speed test tool featuring a stunning Neo-Brutalist Cyber-HUD and a beautiful Terminal Dashboard.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://reactjs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fec9c5b65cd8d8fb7d0470b7b313ee847cee54f5e4f5ae36d389b52df830d65d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31382d626c75653f6c6f676f3d7265616374" alt="React"&gt;&lt;/a&gt;
&lt;a href="https://tailwindcss.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dfe92bc90989d736ab3d8b74b29725192b3692d34493801ed021368f3c8fe933/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e644353532d76342d3338423241433f6c6f676f3d7461696c77696e642d637373" alt="Tailwind v4"&gt;&lt;/a&gt;
&lt;a href="https://python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8afb5face023a2d3d624f1cfd60f60910678f0009b7db614e164249835b6b961/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302b2d4646443433423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d626c7565" alt="Python"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🌐 Web Dashboard (React + Tailwind v4)&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neo-Brutalist Cyber-HUD:&lt;/strong&gt; An immersive, high-performance UI designed for network professionals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Telemetry:&lt;/strong&gt; Real-time SVG charting of downstream and upstream data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Diagnostics:&lt;/strong&gt; Measures Ping, Jitter, Packet Loss, and exact Data Consumption in MB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity Vectoring:&lt;/strong&gt; Pinpoint-accurate ISP, ASN, and geographic location mapping (powered by IPinfo/MaxMind databases).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Grading System:&lt;/strong&gt; Automatically evaluates your connection and assigns a grade (S, A, B, C, F) alongside use-case suitability (e.g., 8K Streaming, E-Sports).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to Clipboard:&lt;/strong&gt; Instantly format and copy your network telemetry for ISP support tickets.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;💻 Command-Line Interface (Python + Rich)&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal Dashboard:&lt;/strong&gt; A beautifully animated &lt;code&gt;rich&lt;/code&gt; console interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Morphing:&lt;/strong&gt; In-place UI updates without spamming your terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ookla Core Integration:&lt;/strong&gt; Uses the global speedtest network…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nishal21/SpedFind" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Here is a breakdown of how I built it and the tech stack behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 The Frontend: A Neo-Brutalist Web HUD
&lt;/h2&gt;

&lt;p&gt;Standard dashboards can be boring. I wanted this to feel like a high-performance Cyber-HUD.&lt;/p&gt;

&lt;p&gt;*&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9og2qfjntm8mcw4wpzc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9og2qfjntm8mcw4wpzc.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw7lbu57dwv5f3zv5j3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw7lbu57dwv5f3zv5j3p.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
*&lt;/p&gt;

&lt;p&gt;I built the web interface using &lt;strong&gt;React, Vite, and Tailwind CSS v4&lt;/strong&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Telemetry:&lt;/strong&gt; It features real-time SVG charting of your downstream and upstream data. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Grading System:&lt;/strong&gt; Instead of just throwing a ping number at you, the app evaluates your connection and assigns a grade (S, A, B, C, F). It actually tells you if your current network can handle 8K streaming or competitive E-Sports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity Vectoring:&lt;/strong&gt; It hooks into IPinfo/MaxMind to pinpoint your ISP, ASN, and geographic location.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💻 The Backend &amp;amp; CLI: Python Power
&lt;/h2&gt;

&lt;p&gt;For developers who want to stay in their workflow, I built a standalone command-line interface.&lt;/p&gt;

&lt;p&gt;*&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k3j8010rirof2ap6ufp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k3j8010rirof2ap6ufp.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Morphing:&lt;/strong&gt; Using Python and the &lt;code&gt;rich&lt;/code&gt; library, the terminal dashboard animates and updates in-place. It gives you all the telemetry data without spamming your console history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI Testing Engine:&lt;/strong&gt; To handle the payload testing and ensure complete control over the telemetry data feeding the React frontend, I built a custom stream engine using FastAPI. It uses the global Ookla network under the hood for enterprise-grade accuracy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Try It Out
&lt;/h2&gt;

&lt;p&gt;The project is 100% free and open-source under the MIT license. There are no paid API keys required to run or self-host this. &lt;/p&gt;

&lt;p&gt;You can check out the live demo of the Web HUD here: &lt;a href="https://nishal21.github.io/SpedFind/" rel="noopener noreferrer"&gt;SpedFind Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like building custom dev tools or just want a better way to check your network, I’d love for you to try it out. Let me know in the comments: do you prefer the Web HUD or the Terminal CLI?&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>python</category>
      <category>react</category>
    </item>
    <item>
      <title>I built a Carbon Footprint tracker for my code (using Tauri?!) 🍃</title>
      <dc:creator>Nishal K</dc:creator>
      <pubDate>Sun, 08 Feb 2026 16:59:10 +0000</pubDate>
      <link>https://dev.to/nishal21/i-built-a-carbon-footprint-tracker-for-my-code-using-electron-2llo</link>
      <guid>https://dev.to/nishal21/i-built-a-carbon-footprint-tracker-for-my-code-using-electron-2llo</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Invisible Emissions ☁️
&lt;/h2&gt;

&lt;p&gt;As developers, we are obsessed with optimization. We profile our code for Time Complexity ($O(n)$), memory leaks, and bundle size.&lt;/p&gt;

&lt;p&gt;But there is one metric we usually ignore: &lt;strong&gt;Carbon Intensity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time we run a heavy build, spin up a Docker container, or train a model, we draw power. Depending on where you live (and your grid's current mix of coal vs. renewables), that power has a carbon cost.&lt;/p&gt;

&lt;p&gt;I wanted to see that cost in real-time. So, I built &lt;strong&gt;CarbonLint&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet CarbonLint 🌍
&lt;/h2&gt;

&lt;p&gt;[Insert Screenshot of your Dashboard here]&lt;/p&gt;

&lt;p&gt;CarbonLint is an open-source desktop app that monitors your development environment's energy usage and estimates the CO2 emissions of your workflow.&lt;/p&gt;

&lt;p&gt;It helps you answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"How much CO2 did that last CI/CD run generate?"&lt;/li&gt;
&lt;li&gt;"Is my local grid green right now, or should I wait to run this heavy task?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Under the Hood 🛠️
&lt;/h2&gt;

&lt;p&gt;I built this using &lt;strong&gt;Tauri&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt;, and &lt;strong&gt;Vite&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Wait, an &lt;em&gt;Tauri&lt;/em&gt; app to save energy? Tauri is known for being lightweight.&lt;/p&gt;

&lt;p&gt;Here is how I tried to balance it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Backend:&lt;/strong&gt; I use &lt;code&gt;systeminformation&lt;/code&gt; and &lt;code&gt;node-powershell&lt;/code&gt; to pull raw system metrics (CPU, Memory, Network).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Calculation:&lt;/strong&gt; The app applies regional grid intensity factors to convert raw kWh into gCO2.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Frontend:&lt;/strong&gt; React + Chart.js for the visualization.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;The hardest part was getting accurate regional data. [Briefly explain how you handled the regional data/grid intensity].&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out (It's Open Source)
&lt;/h2&gt;

&lt;p&gt;I am looking for contributors to help improve the calculation models and add support for more regions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/nishal21/CarbonLint" rel="noopener noreferrer"&gt;https://github.com/nishal21/CarbonLint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech:&lt;/strong&gt; Tauri, React, TailwindCSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are interested in &lt;strong&gt;Green Software Engineering&lt;/strong&gt;, I’d love your feedback!&lt;/p&gt;

&lt;p&gt;Let me know in the comments: &lt;strong&gt;Do you track your code's energy usage?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>react</category>
      <category>javascript</category>
      <category>cleancode</category>
    </item>
  </channel>
</rss>
