<?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: Niroshan Dh</title>
    <description>The latest articles on DEV Community by Niroshan Dh (@niroshan_dh).</description>
    <link>https://dev.to/niroshan_dh</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%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg</url>
      <title>DEV Community: Niroshan Dh</title>
      <link>https://dev.to/niroshan_dh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/niroshan_dh"/>
    <language>en</language>
    <item>
      <title>Check out</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Fri, 11 Sep 2026 10:22:16 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/-38g0</link>
      <guid>https://dev.to/niroshan_dh/-38g0</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/niroshan_dh/the-night-gemini-summoned-a-choir-of-ghosts-in-my-youtube-sidebar-a-software-engineers-57fc" class="crayons-story__hidden-navigation-link"&gt;The Night Gemini Summoned a Choir of Ghosts in My YouTube Sidebar !! A Software Engineer’s Post-Mortem&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/niroshan_dh" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" alt="niroshan_dh profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/niroshan_dh" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Niroshan Dh
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Niroshan Dh
                
                
              
              &lt;div id="story-author-preview-content-4631145" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/niroshan_dh" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Niroshan Dh&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/niroshan_dh/the-night-gemini-summoned-a-choir-of-ghosts-in-my-youtube-sidebar-a-software-engineers-57fc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/niroshan_dh/the-night-gemini-summoned-a-choir-of-ghosts-in-my-youtube-sidebar-a-software-engineers-57fc" id="article-link-4631145"&gt;
          The Night Gemini Summoned a Choir of Ghosts in My YouTube Sidebar !! A Software Engineer’s Post-Mortem
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/niroshan_dh/the-night-gemini-summoned-a-choir-of-ghosts-in-my-youtube-sidebar-a-software-engineers-57fc#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>The Night Gemini Summoned a Choir of Ghosts in My YouTube Sidebar !! A Software Engineer’s Post-Mortem</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Fri, 11 Sep 2026 10:14:08 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/the-night-gemini-summoned-a-choir-of-ghosts-in-my-youtube-sidebar-a-software-engineers-57fc</link>
      <guid>https://dev.to/niroshan_dh/the-night-gemini-summoned-a-choir-of-ghosts-in-my-youtube-sidebar-a-software-engineers-57fc</guid>
      <description>&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%2Fiuokmuajcbnly4fezdg9.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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiuokmuajcbnly4fezdg9.jpg" alt="NiroshanDh" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was late last night, and I was deep in the trenches of YouTube. I was watching a breakdown of statistics and AI usage trying to connect some dots between how human neural pathways process data and how we map that psychology into reinforcement learning. But the creator was spending way too much time explaining basic statistical variance. I didn’t need the 101 class :( ~ I needed the meat.&lt;/p&gt;

&lt;p&gt;So, I opened the Gemini “Ask” side-panel in Chrome, fired off a targeted prompt, and asked it to sift through the noise.&lt;/p&gt;

&lt;p&gt;The AI nailed it. It gave me a crisp, intelligent summarization complete with exact video timestamps. I clicked the first timestamp.&lt;/p&gt;

&lt;p&gt;Nothing happened. 🤔&lt;/p&gt;

&lt;p&gt;I clicked it again. Still nothing. Impatient, I rapid fired a few more clicks across different timestamps. Suddenly, it sounded like I was in a crowded auditorium. Three different instances of the same guy’s voice started overlapping, explaining different parts of the video simultaneously. The chaotic part? The main YouTube video player on the left was still paused.&lt;/p&gt;

&lt;p&gt;I refreshed the page. The ghost voices kept talking.&lt;/p&gt;

&lt;p&gt;As a software engineer, this is the kind of bug that makes you sit up, crack your knuckles, and open the task manager. Here is the autopsy of what actually happened, and why bridging the gap between an AI’s “brain” and a browser’s “body” is harder than it looks.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Autopsy ~ Why the UI Went Rogue🤓
&lt;/h3&gt;

&lt;p&gt;When I checked Chrome’s background processes, I saw multiple hidden instances running. The root cause was a classic architectural disconnect between isolated application states.&lt;/p&gt;

&lt;p&gt;Here is exactly what was going under the hood&lt;/p&gt;

&lt;h4&gt;
  
  
  The Brain/Body Disconnect
&lt;/h4&gt;

&lt;p&gt;Gemini (the neural brain) parsed the context perfectly. It provided the correct timestamp payload. But the Chrome side-panel (the UI body) failed to communicate that state change to the main DOM window.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Isolated iframe Trap
&lt;/h4&gt;

&lt;p&gt;Instead of using an event listener or window.postMessage to pass the ?t=120 timecode to the parent YouTube player, the extension panicked. It treated the timestamp like a standard href link and silently opened it inside its own isolated side-panel environment effectively spinning up an invisible iframe.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Orphaned Threads
&lt;/h4&gt;

&lt;p&gt;If you come from a Java or Go background like I do, you know this pain. In Java, this is the equivalent of accidentally instantiating a brand-new object in a detached thread when you meant to update a Singleton. In Go, it’s like firing off a bunch of detached goroutines that just leak memory in the background because you lost the channel to shut them down.&lt;/p&gt;

&lt;h4&gt;
  
  
  The JavaScript Sandbox
&lt;/h4&gt;

&lt;p&gt;Because Chrome extensions run in an isolated sandbox for security, the side-panel couldn’t natively reach into the YouTube DOM to update the video player’s state. When I spam-clicked the timestamps, I was just spawning more hidden background iframes. The main view remained completely unchanged, but the browser was rendering invisible video players over and over again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Architecture Takeaways
&lt;/h2&gt;

&lt;p&gt;Whether you are building full-stack JavaScript UIs, robust Spring Boot backends, or the next agentic AI interface, this glitch is a perfect reminder of a few core development realities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;State must have a single source of truth&lt;br&gt;
If two components (the side-panel and the main DOM) are trying to play a video, they need a centralized state manager. Otherwise, you get phantom data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fail loudly, not silently&lt;br&gt;
If a UI component fails to communicate with its target, it should throw a visible error. Silently spinning up hidden background frames is how memory leaks and UX nightmares are born.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intelligence doesn’t fix bad plumbing&lt;br&gt;
You can have the most advanced AI model generating flawless output, but if your API endpoints or DOM event listeners drop the payload, the user experiences a broken product.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Event bubbling is a minefield&lt;br&gt;
In component-based design (like React or browser extensions), cross-origin communication requires strict event handling. If you don’t bind your clicks to the right listener, they will trigger default browser behaviors you never intended.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, I had to kill the background processes manually. It was a frustrating UX moment, but a beautiful reminder (: no matter how advanced our AI gets at simulating brain neurons and psychology, it is still entirely at the mercy of some JavaScript event handlers trying to talk to an iframe.&lt;/p&gt;

&lt;p&gt;And honestly? That’s what makes engineering so much fun. :) ……&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Note: This is a harmless UI state bug found in the wild, shared purely for educational and architectural fun.”&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>security</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Fri, 13 Mar 2026 00:51:40 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/-3lhg</link>
      <guid>https://dev.to/niroshan_dh/-3lhg</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/niroshan_dh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" alt="niroshan_dh"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/niroshan_dh/building-a-secure-asynchronous-ai-agent-orchestrator-in-java-1i7o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Building a Secure, Asynchronous AI Agent Orchestrator in Java&lt;/h2&gt;
      &lt;h3&gt;Niroshan Dh ・ Mar 13&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#agentaichallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>architecture</category>
      <category>agentaichallenge</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Secure, Asynchronous AI Agent Orchestrator in Java</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Fri, 13 Mar 2026 00:51:23 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/building-a-secure-asynchronous-ai-agent-orchestrator-in-java-1i7o</link>
      <guid>https://dev.to/niroshan_dh/building-a-secure-asynchronous-ai-agent-orchestrator-in-java-1i7o</guid>
      <description>&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%2Fuswe1ndk716bv27k8wab.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuswe1ndk716bv27k8wab.jpg" alt="Agents"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When developing applications that rely on multiple AI agents, performance and security become massive challenges. AI tasks are heavy and take time. If we process them on the main application thread, the whole system freezes.&lt;/p&gt;

&lt;p&gt;To solve this, I built AegisPipeline a lightweight, event driven Java engine. It uses a Scatter Gather architectural pattern to run AI tasks in the background safely and efficiently.&lt;/p&gt;

&lt;p&gt;Let’s break down the main layers, the Security Gateway, the Orchestrator, the Dispatcher, and the Job Tracker, and see how they interact to process files.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Security &amp;amp; Ingestion (The Gateway)
&lt;/h3&gt;

&lt;p&gt;This is the entry point for user uploads. We cannot simply trust user-provided file extensions (like .pdf or .png) because hackers can easily spoof them to upload malicious scripts.&lt;/p&gt;

&lt;p&gt;How it works: This layer uses Apache Tika to read the file’s “magic bytes” (the raw binary signature) to determine its true MIME type.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example: If a user uploads a file named document.pdf but it's actually an executable script, the Gateway detects the mismatch, fails fast, and rejects the payload before it ever reaches our AI agents. It also generates a random UUID for the filename to prevent Path Traversal attacks.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Core Orchestrator (The Brain)
&lt;/h3&gt;

&lt;p&gt;Once a file is secured and stored, the Orchestrator takes over. It contains the JobManager and the WorkflowStrategy. It acts as the "traffic controller" for AI tasks.&lt;/p&gt;

&lt;p&gt;How it works: Instead of hardcoding which AI agent processes which file, the Orchestrator looks at the validated file type and dynamically selects a strategy.&lt;br&gt;
&lt;em&gt;Example: If the file is a binary (application/x-binary), the Orchestrator selects the SecurityScanStrategy, which knows it needs both a VIRUS_SCANNER agent and a STATIC_ANALYZER agent.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Task Dispatcher (The Muscle)
&lt;/h3&gt;

&lt;p&gt;The dispatcher is where the magic of asynchronous processing happens. It pushes the heavy lifting off the main application thread so the system remains fast and responsive for other users.&lt;/p&gt;

&lt;p&gt;How it works: It uses Java’s ExecutorService (a fixed thread pool) and CompletableFuture to scatter the tasks to different AI agents simultaneously.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// We use CompletableFuture to push the heavy AI processing to a background thread.&lt;/span&gt;
&lt;span class="c1"&gt;// This frees up the main application thread to accept more user uploads.&lt;/span&gt;
&lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;supplyAsync&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
 &lt;span class="c1"&gt;// The specific AI agent executes its heavy analysis here&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;executeAnalysis&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secureFilePath&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
 &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Agent failed: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Fail-safe return&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;},&lt;/span&gt; &lt;span class="n"&gt;aiThreadPool&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Job Tracker (The Memory)
&lt;/h3&gt;

&lt;p&gt;Because multiple AI agents are processing data at the exact same time on different threads, we need a highly secure way to store their results without data corruption.&lt;/p&gt;

&lt;p&gt;How it works: The JobTracker acts as an in-memory database using a ConcurrentHashMap. It uses an AtomicInteger to count how many tasks have finished.&lt;br&gt;
&lt;em&gt;Example: When the VIRUS_SCANNER finishes, it saves its score here. Because we use atomic operations, if two agents finish at the exact same millisecond, the system still counts them perfectly.&lt;/em&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%2F116xwyo1syl5dj9oltsf.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%2F116xwyo1syl5dj9oltsf.png" alt="system architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s look at an example: How all these layers work together&lt;br&gt;
Here is the exact flow when a user uploads a file for AI analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client Upload -&amp;gt; The user uploads a file to the system.&lt;/li&gt;
&lt;li&gt;Security Gateway -&amp;gt; The SecureIngestionService validates the magic bytes, assigns a safe UUID, and saves the file via the StorageProvider.&lt;/li&gt;
&lt;li&gt;Core Orchestrator -&amp;gt; The JobManager finds the matching WorkflowStrategy for the file type to see which AI agents are needed.&lt;/li&gt;
&lt;li&gt;Job Tracker -&amp;gt; Initializes a new job session, locking in the exact number of AI agents we expect to hear back from.&lt;/li&gt;
&lt;li&gt;Task Dispatcher (Scatter) -&amp;gt; Throws the tasks into the background ExecutorService thread pool.&lt;/li&gt;
&lt;li&gt;AI Agents -&amp;gt; The required agents analyze the file in parallel.&lt;/li&gt;
&lt;li&gt;Job Tracker (Gather) -&amp;gt; Each agent reports its score back to the thread-safe map.&lt;/li&gt;
&lt;li&gt;Core Orchestrator (Fusion) -&amp;gt; Once the final agent finishes, the WorkflowStrategy calculates a final weighted probability score and cleans up the memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Find it on -&amp;gt; &lt;a href="https://github.com/Niroshan2812/aegis-pipeline-core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>agentaichallenge</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Free, Private Audio Transcriber with Next.js</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Mon, 12 Jan 2026 04:34:56 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/building-a-free-private-audio-transcriber-with-nextjs-2df6</link>
      <guid>https://dev.to/niroshan_dh/building-a-free-private-audio-transcriber-with-nextjs-2df6</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/niroshan_dh/3-ways-to-run-ai-in-the-browser-with-nextjs-no-api-keys-required-3gi6" class="crayons-story__hidden-navigation-link"&gt;3 Ways to Run AI in the Browser with Next.js (No API Keys Required)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/niroshan_dh" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" alt="niroshan_dh profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/niroshan_dh" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Niroshan Dh
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Niroshan Dh
                
              
              &lt;div id="story-author-preview-content-3165412" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/niroshan_dh" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Niroshan Dh&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/niroshan_dh/3-ways-to-run-ai-in-the-browser-with-nextjs-no-api-keys-required-3gi6" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 12&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/niroshan_dh/3-ways-to-run-ai-in-the-browser-with-nextjs-no-api-keys-required-3gi6" id="article-link-3165412"&gt;
          3 Ways to Run AI in the Browser with Next.js (No API Keys Required)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/niroshan_dh/3-ways-to-run-ai-in-the-browser-with-nextjs-no-api-keys-required-3gi6#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>No Server. No API Keys. Just AI running in your browser.</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Mon, 12 Jan 2026 04:33:42 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/no-server-no-api-keys-just-ai-running-in-your-browser-4feb</link>
      <guid>https://dev.to/niroshan_dh/no-server-no-api-keys-just-ai-running-in-your-browser-4feb</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/niroshan_dh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" alt="niroshan_dh"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/niroshan_dh/3-ways-to-run-ai-in-the-browser-with-nextjs-no-api-keys-required-3gi6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;3 Ways to Run AI in the Browser with Next.js (No API Keys Required)&lt;/h2&gt;
      &lt;h3&gt;Niroshan Dh ・ Jan 12&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#machinelearning&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>3 Ways to Run AI in the Browser with Next.js (No API Keys Required)</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Mon, 12 Jan 2026 04:30:43 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/3-ways-to-run-ai-in-the-browser-with-nextjs-no-api-keys-required-3gi6</link>
      <guid>https://dev.to/niroshan_dh/3-ways-to-run-ai-in-the-browser-with-nextjs-no-api-keys-required-3gi6</guid>
      <description>&lt;h2&gt;
  
  
  The "API Fatigue" is Real
&lt;/h2&gt;

&lt;p&gt;We are all building AI wrappers. But the standard pattern Frontend sends data to Backend → Backend hits OpenAI → Backend pays $0.03 → Frontend displays result is getting expensive. And frankly, it's boring.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if your users could run Whisper, YOLO, or even Llama directly in their Chrome tab?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I recently built CodeCoffeeTools.com entirely around this "Client-Side AI" concept. Here is the technical breakdown of how you can do it too using Transformers.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is this even possible?
&lt;/h2&gt;

&lt;p&gt;You might think running a neural network in JavaScript would be agonizingly slow. It used to be. But three technologies have converged to make this viable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ONNX Runtime: A cross-platform accelerator for machine learning models.&lt;/li&gt;
&lt;li&gt;WebAssembly (WASM): Allows C++ code (the ONNX runtime) to run at near-native speed in the browser.&lt;/li&gt;
&lt;li&gt;Transformers.js: A library by Hugging Face that bridges the gap, letting you use models just like you would in Python, but in JS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The "Free" Audio Transcriber (Whisper)&lt;/strong&gt;&lt;br&gt;
Instead of paying OpenAI $0.006/minute, we use the Whisper-Tiny model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { pipeline } from '@xenova/transformers';
// 1. Create the pipeline (Downloads the 40MB model once)
const transcriber = await pipeline('automatic-speech-recognition', 'Xenova/whisper-tiny.en');
// 2. Transcribe
const result = await transcriber('https://example.com/my-audio.mp3');
// 3. Output
console.log(result.text); 
// Output: "Hello world, this is a test." 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note -: Always run this in a Web Worker so you don't freeze the UI while the transcription crunches numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-Time Object Detection (YOLO)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We can run object detection (identifying "person", "car", "dog") at 60 FPS in the browser using the detr-resnet-50 model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { pipeline } from '@xenova/transformers';

// 1. Load the detection pipeline
const detector = await pipeline('object-detection', 'Xenova/detr-resnet-50');
// 2. Detect objects in an image
const output = await detector('my-image.jpg');
// 3. Result
console.log(output);
/* [
  { label: 'person', score: 0.99, box: { xmin: 50, ymin: 20... } },
  { label: 'bicycle', score: 0.95, box: { xmin: 120, ymin: 80... } }
] 
*/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Running a Chatbot Locally (Text Generation)&lt;/strong&gt;&lt;br&gt;
Yes, you can run LLMs in the browser. You won't run GPT-4, but you can run highly optimized models like Phi-2 or TinyLlama.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { pipeline } from '@xenova/transformers';
const generator = await pipeline('text-generation', 'Xenova/TinyLlama-1.1B-Chat-v1.0');
const output = await generator('Write a tagline for a coffee shop:', {
  max_new_tokens: 20,
  temperature: 0.7
});
console.log(output[0].generated_text); 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note -: This requires WebGPU support for decent speed, which Transformers.js v3 (currently in alpha/beta) supports brilliantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;Yes it's matter - "But won't this crash my user's browser?"&lt;/p&gt;

&lt;p&gt;It can, if you aren't careful. Here is how I handled performance on CodeCoffeeTools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Quantization is Key: I never use the full "float32" models. I use "quantized" (q8 or q4) versions. They are 4x smaller and run 2x faster with almost zero loss in accuracy.&lt;/li&gt;
&lt;li&gt;2. Lazy Loading: Do NOT load the AI model when the homepage loads. Only load it when the user clicks "Start Tool."&lt;/li&gt;
&lt;li&gt;3. Cache It: Transformers.js caches files in the browser. The first visit takes 10 seconds to download; the second visit takes 100ms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are moving towards a web where the server just serves the app, and the client does the thinking.&lt;br&gt;
If you want to see these examples running live (and critique my code), check out CodeCoffeeTools.com. I've open-sourced the "Privacy-First" philosophy, even if the repo itself is private for now.&lt;br&gt;
What should I build next? A local Background Remover or a PDF Summarizer? Let me know below!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Heee check this out..</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Thu, 01 Jan 2026 16:35:26 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/heee-check-this-out-4fkb</link>
      <guid>https://dev.to/niroshan_dh/heee-check-this-out-4fkb</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/niroshan_dh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" alt="niroshan_dh"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/niroshan_dh/new-update-for-codecoffeetools-i-include-p2p-transfer-tool-more-3anp" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;New update for CodeCoffeeTools! I include P2P Transfer Tool + more..&lt;/h2&gt;
      &lt;h3&gt;Niroshan Dh ・ Jan 1&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>productivity</category>
      <category>security</category>
    </item>
    <item>
      <title>New update for CodeCoffeeTools! I include P2P Transfer Tool + more..</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Thu, 01 Jan 2026 12:08:30 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/new-update-for-codecoffeetools-i-include-p2p-transfer-tool-more-3anp</link>
      <guid>https://dev.to/niroshan_dh/new-update-for-codecoffeetools-i-include-p2p-transfer-tool-more-3anp</guid>
      <description>&lt;p&gt;&lt;strong&gt;Happy New Year, everyone! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I hope 2026 is off to a great start for all of you. To kick off the year, I’ve been working on a massive update for my side project, &lt;a href="https://codecoffeetools.com" rel="noopener noreferrer"&gt;CodeCoffeeTools&lt;/a&gt;.&lt;br&gt;
A few weeks ago, I shared &lt;a href="https://codecoffeetools.com" rel="noopener noreferrer"&gt;CodeCoffeeTools&lt;/a&gt; here a collection of developer tools + ...  that run 100% locally in your browser. The response was amazing, but I kept hearing one request &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do I move these secure files between my devices without using the cloud?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, I got to work. ☕&lt;/p&gt;

&lt;p&gt;I just pushed a major update to &lt;strong&gt;CodeCoffeeTools&lt;/strong&gt;, introducing &lt;strong&gt;Peer-to-Peer (P2P) File Transfer&lt;/strong&gt;, a native &lt;strong&gt;App Install (PWA)&lt;/strong&gt; feature, and a bunch of new utilities.&lt;/p&gt;

&lt;p&gt;Here is what’s new! 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  1. P2P File Transfer (No Server Storage)
&lt;/h2&gt;

&lt;p&gt;We've all been there: You have a sensitive file on your laptop that you need on your phone. You usually email it to yourself or upload it to a random cloud drive. &lt;strong&gt;That breaks the privacy chain.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I added a new &lt;strong&gt;P2P File Transfer&lt;/strong&gt; tool that connects your devices directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; It establishes a direct connection between your browser tabs (using WebRTC logic).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; The file streams strictly from Device A to Device B. It is never stored on my server, not even for a second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; Since it's local (if you are on the same WiFi), it's blazing fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. You Can Now "Install" The App
&lt;/h2&gt;

&lt;p&gt;CodeCoffeeTools is now a fully capable &lt;strong&gt;Progressive Web App (PWA)&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install it:&lt;/strong&gt; Click the "Install" button (or the &lt;code&gt;+&lt;/code&gt; icon in your address bar) to add it to your Dock (Mac) or Home Screen (iOS/Android).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Capable:&lt;/strong&gt; Many tools now work even if you lose your internet connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Feel:&lt;/strong&gt; No more hunting through browser tabs to find your JSON validator.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Freshly Brewed Tools
&lt;/h2&gt;

&lt;p&gt;I didn't stop at infrastructure. Based on your feedback, I’ve added several new tools to the roster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SVG to PNG Converter:&lt;/strong&gt; Scale and convert vectors without pixelation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QR Code Generator:&lt;/strong&gt; Create quick links for testing on mobile devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Citation Generator:&lt;/strong&gt; (For the students out there!) Format references instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cooking &amp;amp; Unit Converters:&lt;/strong&gt; Because sometimes developers bake too. 🍰&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why "Privacy-First" Still Matters
&lt;/h2&gt;

&lt;p&gt;Every tool on the site still adheres to the core philosophy: &lt;strong&gt;Your data never leaves your device.&lt;/strong&gt; whether you are compressing a massive image or formatting a sensitive SQL query, the processing happens in &lt;em&gt;your&lt;/em&gt; browser's JavaScript engine, not on a backend server.&lt;/p&gt;

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

&lt;p&gt;I’m building this as I complete my software engineering degree, and I’d love your feedback on the new P2P feature.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Check it out:&lt;/strong&gt; &lt;a href="https://codecoffeetools.com" rel="noopener noreferrer"&gt;codecoffeetools.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know in the comments: &lt;strong&gt;What is the one "tiny" tool you use every day that you wish was offline-first?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>productivity</category>
      <category>security</category>
    </item>
    <item>
      <title>I built this because I was tired of uploading my personal data to random converter sites. I'd love to hear if there are any other tools you think I should add. Thanks for checking it out!</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Mon, 15 Dec 2025 11:11:40 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/i-built-this-because-i-was-tired-of-uploading-my-personal-data-to-random-converter-sites-id-love-11hg</link>
      <guid>https://dev.to/niroshan_dh/i-built-this-because-i-was-tired-of-uploading-my-personal-data-to-random-converter-sites-id-love-11hg</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404" class="crayons-story__hidden-navigation-link"&gt;Stop Uploading Your Data! Why I Built a Privacy-First Dev Toolkit (CodeCoffeeTools)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/niroshan_dh" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" alt="niroshan_dh profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/niroshan_dh" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Niroshan Dh
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Niroshan Dh
                
              
              &lt;div id="story-author-preview-content-3106341" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/niroshan_dh" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Niroshan Dh&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 15 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404" id="article-link-3106341"&gt;
          Stop Uploading Your Data! Why I Built a Privacy-First Dev Toolkit (CodeCoffeeTools)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/privacy"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;privacy&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              4&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>privacy</category>
      <category>security</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Mon, 15 Dec 2025 11:07:29 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/-28gf</link>
      <guid>https://dev.to/niroshan_dh/-28gf</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/niroshan_dh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F2170688%2Ffdf3737c-39e8-4b20-8dcd-58f4e469ba06.jpg" alt="niroshan_dh"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Stop Uploading Your Data! Why I Built a Privacy-First Dev Toolkit (CodeCoffeeTools)&lt;/h2&gt;
      &lt;h3&gt;Niroshan Dh ・ Dec 15&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#privacy&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>privacy</category>
      <category>security</category>
    </item>
    <item>
      <title>Stop Uploading Your Data! Why I Built a Privacy-First Dev Toolkit (CodeCoffeeTools)</title>
      <dc:creator>Niroshan Dh</dc:creator>
      <pubDate>Mon, 15 Dec 2025 11:04:31 +0000</pubDate>
      <link>https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404</link>
      <guid>https://dev.to/niroshan_dh/stop-uploading-your-data-why-i-built-a-privacy-first-dev-toolkit-codecoffeetools-404</guid>
      <description>&lt;h2&gt;
  
  
  The privacy problem with online tools
&lt;/h2&gt;

&lt;p&gt;We've all been there. You need to convert a PDF, format some JSON, or hash a password quickly. You search for a free tool, upload your file to the first result, and then… wait.&lt;br&gt;
But as a software engineer, a thought nags at the back of your mind,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where did my files actually go?&lt;/li&gt;
&lt;li&gt;is this server storing my data?&lt;/li&gt;
&lt;li&gt;Did I just upload sensitive metadata to a random site?
Most online tools process your data on their backend. yes. this means your files leave your device, travel across the internet, and land on a server you don't control.. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The solution --&amp;gt; &lt;a href="https://codecoffeetools.com/" rel="noopener noreferrer"&gt;Codecoffeetools.com&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I build &lt;a href="https://codecoffeetools.com/" rel="noopener noreferrer"&gt;Codecoffeetools &lt;/a&gt;to solve this specific problem. it is a collection of professional grade developer and office tools that run 100% locally in your browser. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Privacy-First" Matters?
&lt;/h2&gt;

&lt;p&gt;By leveraging modern JavaScript APIs, we can perform heavy tasks—like image compression, PDF manipulation, and encryption—right on the client side.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Data Leaks&lt;/strong&gt; - Your files literally never leave your device.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Latency&lt;/strong&gt; - No upload/download time. Results are instant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Cost&lt;/strong&gt; - Free forever, no subscriptions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Inside?
&lt;/h2&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%2Fkstfo15zbuwr1acfwdya.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%2Fkstfo15zbuwr1acfwdya.png" alt="Codecoffetools category list " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve packed it with tools I use daily as a developer and student&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🔒 Security:&lt;br&gt;
&lt;strong&gt;Exif Data Remover&lt;/strong&gt; - Clean metadata from photos before sharing.&lt;br&gt;
&lt;strong&gt;Client-Side Password Generator&lt;/strong&gt; - Create strong credentials without them touching a network request.&lt;br&gt;
&lt;strong&gt;and more&lt;/strong&gt;....&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;👨‍💻 Developer Tools:&lt;br&gt;
&lt;strong&gt;JSON Formatter &amp;amp; Validator&lt;/strong&gt; - Beautify messy API responses.&lt;br&gt;
&lt;strong&gt;SQL Formatter&lt;/strong&gt; - Clean up complex queries.&lt;br&gt;
&lt;strong&gt;Diff Checker&lt;/strong&gt; - Compare code snippets locally.&lt;br&gt;
&lt;strong&gt;and more&lt;/strong&gt;....&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 PDF &amp;amp; Image:&lt;br&gt;
&lt;strong&gt;Merge, Split, and Watermark&lt;/strong&gt; PDFs instantly.&lt;br&gt;
** Compress images** without quality loss.&lt;br&gt;
&lt;strong&gt;and more&lt;/strong&gt;....&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📷 Image Tools:&lt;br&gt;
&lt;strong&gt;Image Compressor&lt;/strong&gt; - Compress images locally to reduce file size while maintaining quality.&lt;br&gt;
&lt;strong&gt;HEIC to JPG Converter&lt;/strong&gt; - Convert iPhone photos (HEIC) to JPG locally.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I’d love for you to break it (or just use it!). Check it out here: 👉 &lt;a href="https://codecoffeetools.com/" rel="noopener noreferrer"&gt;codecoffeetools.com&lt;/a&gt;&lt;br&gt;
Feedback is welcome! Let me know in the comments if there’s a specific tool you’d like to see added next.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>privacy</category>
      <category>security</category>
    </item>
  </channel>
</rss>
