<?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: Naing Oo</title>
    <description>The latest articles on DEV Community by Naing Oo (@n92).</description>
    <link>https://dev.to/n92</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3733995%2Fcfd75438-af84-4b87-8849-9512e808fb6e.png</url>
      <title>DEV Community: Naing Oo</title>
      <link>https://dev.to/n92</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/n92"/>
    <language>en</language>
    <item>
      <title>Gemma 4: What I Learned Running Google's Open AI Model on Real Hardware</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Sat, 23 May 2026 00:46:38 +0000</pubDate>
      <link>https://dev.to/n92/gemma-4-what-i-learned-running-googles-open-ai-model-on-real-hardware-8g7</link>
      <guid>https://dev.to/n92/gemma-4-what-i-learned-running-googles-open-ai-model-on-real-hardware-8g7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Write About Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most AI tutorials show you how to call an API. You send text in, you get text back, and everything works perfectly in a Jupyter notebook.&lt;/p&gt;

&lt;p&gt;Real deployments are messier. And the mess is where you actually learn something.&lt;/p&gt;

&lt;p&gt;I've been running Gemma 4 on an HPC (High-Performance Computing) cluster for the past few weeks — the kind of environment where you submit jobs to a queue, share GPUs with other researchers, and debug library errors at 11pm. Here's what I wish someone had told me before I started.&lt;/p&gt;




&lt;h2&gt;
  
  
  First: What Even Is Gemma 4?
&lt;/h2&gt;

&lt;p&gt;Gemma 4 is Google's latest family of open-weight language models. "Open-weight" means you can download and run the model yourself — no API key, no usage fees, no data leaving your machine.&lt;/p&gt;

&lt;p&gt;The family includes several variants, but the two most interesting are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 E4B&lt;/strong&gt; — A "Mixture of Experts" model. Think of it as a large model that only activates a small part of itself for each word it generates. Clever architecture, ~15GB to load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 27B&lt;/strong&gt; — A traditional "dense" model. All 27 billion parameters work together every time. Much more memory-hungry, but predictable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also smaller 4B and 12B dense versions. For most developers, these are the starting point.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Mixture of Experts" Thing, Explained Simply
&lt;/h2&gt;

&lt;p&gt;You'll see &lt;strong&gt;MoE&lt;/strong&gt; (Mixture of Experts) mentioned a lot with Gemma 4. Here's what it actually means.&lt;/p&gt;

&lt;p&gt;A normal language model processes every word through all of its parameters, every single time. A MoE model has multiple "expert" sub-networks, and for each word, it only activates a few of them — the most relevant ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The promise:&lt;/strong&gt; You get the capacity of a big model with the compute cost of a small one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; The entire model — all experts — still needs to fit in your GPU's memory, even though only some of them run at any given moment.&lt;/p&gt;

&lt;p&gt;In practice, on a 20GB GPU slice, I measured:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 E4B (MoE)&lt;/td&gt;
&lt;td&gt;~3–4 words/second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 3 4B dense&lt;/td&gt;
&lt;td&gt;~10–11 words/second&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The dense model was nearly &lt;strong&gt;3× faster&lt;/strong&gt; in my constrained setup. The MoE model's routing overhead and larger memory footprint more than offset its theoretical efficiency gains when you're tight on VRAM.&lt;/p&gt;

&lt;p&gt;This doesn't mean MoE is bad — it means it needs room to breathe. On a full A100 80GB GPU or multiple GPUs, the story flips.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which Variant Should You Pick?
&lt;/h2&gt;

&lt;p&gt;Here's a simple guide:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 4B dense&lt;/strong&gt; — Start here. Runs on a gaming GPU (RTX 3080/4080), fast, capable, easy to experiment with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 E4B (MoE)&lt;/strong&gt; — Pick this when you have a large GPU (40GB+) and need multimodal support (text + images). Don't pick it just because "MoE" sounds exciting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 27B&lt;/strong&gt; — When quality matters more than speed and you have a serious GPU. Research, complex reasoning tasks, high-stakes extraction.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 128K Context Window: Why It Actually Matters
&lt;/h2&gt;

&lt;p&gt;Every model has a "context window" — the maximum amount of text it can read at once. Older models had 4,000–8,000 tokens (roughly 3,000–6,000 words). Gemma 4 supports &lt;strong&gt;128,000 tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's not just a bigger number. It changes what you can build.&lt;/p&gt;

&lt;h3&gt;
  
  
  What becomes possible with 128K context:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Read whole documents.&lt;/strong&gt; Instead of chopping a long PDF into chunks and hoping the right chunk gets retrieved, you can feed the entire document in. No information lost between sections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Longer conversations with memory.&lt;/strong&gt; You can keep the full history of a conversation in context instead of needing a database to "remember" what was said earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complex multi-step tasks.&lt;/strong&gt; Automated agents that reason across many steps need space to store their thinking. At 4K context, they run out of room. At 128K, they can work much longer.&lt;/p&gt;

&lt;p&gt;The practical limit is memory — filling 128K context uses a lot of GPU RAM. But even using 30–40K when you need it (rather than being capped at 4K) is a real quality-of-life improvement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Images Too: Gemma 4's Multimodal Capability
&lt;/h2&gt;

&lt;p&gt;The E4B and 27B variants can understand images as well as text. You send a photo alongside your question, and the model can describe it, extract information from it, answer questions about it.&lt;/p&gt;

&lt;p&gt;What this looks like in code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/jpeg;base64,...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What does this document say about payment terms?&lt;/span&gt;&lt;span class="sh"&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="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this is a bigger deal than it sounds:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before multimodal models were locally runnable, if you wanted to extract data from a scanned form, you needed: an OCR tool, a parser, and then a language model. That's three separate systems to maintain.&lt;/p&gt;

&lt;p&gt;Now: one model, one call.&lt;/p&gt;

&lt;p&gt;More importantly — it runs &lt;strong&gt;on your hardware&lt;/strong&gt;. Documents that contain sensitive information (medical records, financial statements, legal contracts) never leave your control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Running It on an HPC Cluster: The Honest Account
&lt;/h2&gt;

&lt;p&gt;If you're deploying Gemma 4 in a university or corporate HPC environment, here are the things that will go wrong and how to fix them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 1: Missing CUDA library
&lt;/h3&gt;

&lt;p&gt;The first error you'll almost certainly hit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OSError: libcusparseLt.so.0: cannot open shared object file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PyTorch ships with this library under a versioned filename, but then looks for the un-versioned version. Create a symlink:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$CONDA_PREFIX&lt;/span&gt;/lib/python3.x/site-packages/torch/lib
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; libcusparseLt-f80c68d1.so.0 libcusparseLt.so.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And add to your SLURM job script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CONDA_PREFIX&lt;/span&gt;/lib/python3.x/site-packages/torch/lib:&lt;span class="nv"&gt;$LD_LIBRARY_PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do this once, before anything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 2: Two requests hitting the model at the same time
&lt;/h3&gt;

&lt;p&gt;When you serve a model via a web API, multiple users can send requests simultaneously. Two calls to &lt;code&gt;model.generate()&lt;/code&gt; at the same time on a single GPU will either crash or corrupt each other.&lt;/p&gt;

&lt;p&gt;The fix is a simple lock — one request runs at a time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;

&lt;span class="n"&gt;_MODEL_LOCK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;_MODEL_LOCK&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Only one thread can be here at a time
&lt;/span&gt;        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not fancy. Not fast. But correct.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 3: The system prompt being silently ignored
&lt;/h3&gt;

&lt;p&gt;Gemma uses a specific message format. If you format your system message like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This looks right but doesn't work properly
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful assistant.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model may not follow it reliably. The correct format wraps the content in a list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This is what Gemma actually expects
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful assistant.&lt;/span&gt;&lt;span class="sh"&gt;"&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;p&gt;Use &lt;code&gt;tokenizer.apply_chat_template()&lt;/code&gt; to avoid doing this manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;formatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply_chat_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tokenize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;add_generation_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Getting Gemma to Extract Structured Data Reliably
&lt;/h2&gt;

&lt;p&gt;One of the most useful things you can do with any instruction-tuned model is ask it to read unstructured text and return structured JSON. Gemma 4 does this well — but the quality depends heavily on how you write your instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vague instruction → unreliable output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Extract the person's work experience as JSON.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Specific instruction → reliable output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Extract the object's attributes as JSON.
Rules:
- Only include attributes listed under "Colors"
- Do NOT include defects from the shape section
- Calculate total years: sum all months worked, divide by 12, round to 1 decimal
  Example: 6 + 24 + 18 = 48 months = 4.0 years
- Return ONLY valid JSON. No markdown fences, no explanation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two changes that matter most:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Show example arithmetic&lt;/strong&gt; — models are bad at mental math. Showing the steps ("6 + 24 + 18 = 48") dramatically improves accuracy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name what NOT to do&lt;/strong&gt; — counter-examples work better than positive examples alone. "Do NOT include" is often clearer than "Only include."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Why Run Locally at All?
&lt;/h2&gt;

&lt;p&gt;Fair question. Calling GPT-4o or Claude via API is easier. Why go through all of this?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your data stays yours.&lt;/strong&gt; If you're processing CVs, medical notes, legal documents, or anything confidential — locally-run means zero data ever leaves your system. For regulated industries, this isn't optional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No per-call costs at scale.&lt;/strong&gt; API pricing adds up. Once your model is running, inference is just electricity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No rate limits.&lt;/strong&gt; No waiting in a shared queue. Your batch job runs when you tell it to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model doesn't change under you.&lt;/strong&gt; API providers update their models silently. A locally-downloaded checkpoint stays exactly as it was.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can customise it.&lt;/strong&gt; Fine-tuning, adding adapters, changing the tokeniser — all possible locally. Most APIs don't expose this.&lt;/p&gt;

&lt;p&gt;For a specific, well-defined task — document understanding, structured extraction, domain-specific Q&amp;amp;A — Gemma 4 running locally is genuinely competitive with frontier APIs. It won't win every benchmark. But for the use cases where data control and cost matter, the gap in quality is smaller than the gap in control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference: Things to Know Before You Start
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Key Point&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Which model to start with&lt;/td&gt;
&lt;td&gt;4B dense — works on a single consumer GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoE (E4B)&lt;/td&gt;
&lt;td&gt;Needs 40GB+ GPU to outperform dense; multimodal support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27B dense&lt;/td&gt;
&lt;td&gt;Best quality, needs serious hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context window&lt;/td&gt;
&lt;td&gt;128K tokens — use it for whole documents and long tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images&lt;/td&gt;
&lt;td&gt;E4B and 27B support image input out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA error on startup&lt;/td&gt;
&lt;td&gt;Create symlink for &lt;code&gt;libcusparseLt.so.0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent requests&lt;/td&gt;
&lt;td&gt;Use a threading lock — one generate call at a time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System prompt format&lt;/td&gt;
&lt;td&gt;Wrap content in a list: &lt;code&gt;[{"type": "text", "text": "..."}]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured JSON extraction&lt;/td&gt;
&lt;td&gt;Use explicit rules + counter-examples + show arithmetic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Gemma 4 is the clearest sign yet that frontier-quality open models are no longer a future promise. They're here, they run on hardware you can actually get, and the reasons to use them — privacy, cost, control — are only getting stronger.&lt;/p&gt;

&lt;p&gt;The friction of local deployment is real. But it's mostly one-time setup friction, not ongoing complexity. Once the symlinks are in place, the lock is written, and the chat template is correct, it just runs.&lt;/p&gt;




</description>
      <category>gemma</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I launched Two Mirrors on Playstore</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Sat, 25 Apr 2026 22:51:02 +0000</pubDate>
      <link>https://dev.to/n92/i-launched-two-mirrors-on-playstore-1g97</link>
      <guid>https://dev.to/n92/i-launched-two-mirrors-on-playstore-1g97</guid>
      <description>&lt;p&gt;I wanted a tool that would allow me to fully utilize the cameras of my smartphones as mirrors. By utilizing Wifi direct as the underlying technology, I built Two Mirrors on Android. The way it works is, one smart phone acts as the host and the other connects to it. Once the pairing succeeds, the camera feed is reflected on both phones. &lt;/p&gt;

&lt;p&gt;As a bonus, one can also use the Webcam feature. For that, tailscale can be used to put the PC and the smart phone on the same network and a Python script available on Github can be run to connect to the target smartphone's tailscale IP. &lt;/p&gt;

&lt;p&gt;App Link &lt;a href="https://play.google.com/store/apps/details?id=com.uniktek.twomirrors&amp;amp;pcampaignid=web_share" rel="noopener noreferrer"&gt;Two Mirrors&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Python script for webcam &lt;a href="https://github.com/n-92/Two-Mirrors-Helper-Script" rel="noopener noreferrer"&gt;Two Mirrors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>powerapps</category>
    </item>
    <item>
      <title>How many of you agree with this?</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Fri, 10 Apr 2026 05:38:53 +0000</pubDate>
      <link>https://dev.to/n92/how-many-of-you-agree-with-this-218c</link>
      <guid>https://dev.to/n92/how-many-of-you-agree-with-this-218c</guid>
      <description>&lt;p&gt;7 days ago, Garrett Rose posted a video of his struggles in getting hired as a SWE. It is a really sincere video where he clearly articulated what many in the industry are facing currently. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The threat of being replaced by AI&lt;/li&gt;
&lt;li&gt;Scam job posts&lt;/li&gt;
&lt;li&gt;Companies bullying the candidate with at least 4 rounds of interviews followed by a ridiculous technical test. &lt;/li&gt;
&lt;li&gt;Ghosting
and much more. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Check it out and let us kick off this discussion because sooner or later, it is going to affect you and me. &lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Silent Flames</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Wed, 25 Mar 2026 00:44:12 +0000</pubDate>
      <link>https://dev.to/n92/silent-flames-48k2</link>
      <guid>https://dev.to/n92/silent-flames-48k2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Frontend Art&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Art
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://uniktek.me/silent-flames/" rel="noopener noreferrer"&gt;Silent Flames - For the voices behind the shadows&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;Silent Flames was inspired by the millions of women — mothers, wives, caregivers — whose daily sacrifices form the invisible foundation of the world around them. They iron the shirts behind the promotions, stay awake so others can rest, and choose silence over applause — not because they are lesser, but because they are the architecture of someone else's sky.&lt;/p&gt;

&lt;p&gt;The meaning I hope to convey is simple: recognition. Not with grand gestures, but with the same quiet sincerity these women bring to everything they do. You are the silent flame — and the world is warm because of you.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/n-92/silent-flames" rel="noopener noreferrer"&gt;Github Link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>devchallenge</category>
      <category>frontend</category>
      <category>css</category>
    </item>
    <item>
      <title>AnimateLI5: Animation Software for a 5 year old</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Tue, 24 Mar 2026 20:02:04 +0000</pubDate>
      <link>https://dev.to/n92/animateli5-animation-software-for-a-5-year-old-280o</link>
      <guid>https://dev.to/n92/animateli5-animation-software-for-a-5-year-old-280o</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;My niece wanted to make animations. I tried a dozen apps — they all had tiny buttons, complex menus, text-heavy interfaces, and features designed for adults. A 5-year-old shouldn't need to read a tooltip to draw a star.&lt;/p&gt;

&lt;p&gt;So I built one from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet AnimateLI5
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AnimateLI5&lt;/strong&gt; (Animate Like I'm 5) is a free, open-source Windows desktop app that lets very young children create frame-by-frame animations.&lt;/p&gt;

&lt;p&gt;The design philosophy is simple: &lt;strong&gt;if a child can't figure it out in 5 seconds, it's too complicated.&lt;/strong&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%2F90yrfu5dlbxbzfuo93x4.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%2F90yrfu5dlbxbzfuo93x4.png" alt="AnimateLI5 Interface" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  No Reading Required
&lt;/h3&gt;

&lt;p&gt;Every single feature works through icons, colors, and spatial cues. There are no menus to navigate, no dialogs to read, no settings to configure. Just big colorful buttons that do obvious things.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can Kids Do With It?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Draw shapes&lt;/strong&gt; — tap a shape button, tap the canvas. 10+ shapes including stars, triangles, and hexagons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freehand drawing&lt;/strong&gt; — brush tool with adjustable size and 9 color choices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move, resize, rotate&lt;/strong&gt; — drag handles on any element&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erase mistakes&lt;/strong&gt; — circle eraser removes elements under the cursor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build animations&lt;/strong&gt; — add frames, duplicate frames, reorder them in a visual timeline strip&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch it play&lt;/strong&gt; — hit the big green play button, adjust speed from 1–30 FPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import stickers&lt;/strong&gt; — drag &amp;amp; drop any image as a stamp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo everything&lt;/strong&gt; — every action is undoable, because kids experiment fearlessly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to video&lt;/strong&gt; — render to MP4 with a progress bar&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WPF on .NET 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;C# 12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MVVM with CommunityToolkit.Mvvm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft.Extensions.DependencyInjection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Video Export&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ffmpeg (external)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;xUnit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Architecture Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why WPF in 2026?
&lt;/h3&gt;

&lt;p&gt;I know, I know. But for a Windows-only kids tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardware-accelerated vector rendering out of the box&lt;/li&gt;
&lt;li&gt;Mature data binding (MVVM just works)&lt;/li&gt;
&lt;li&gt;Rich input handling (mouse, touch, stylus)&lt;/li&gt;
&lt;li&gt;Single self-contained EXE — no browser, no Electron, no 200MB runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why MVVM with Source Generators?
&lt;/h3&gt;

&lt;p&gt;CommunityToolkit.Mvvm's source generators eliminate boilerplate. Instead of 15 lines of &lt;code&gt;INotifyPropertyChanged&lt;/code&gt; plumbing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ObservableProperty&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_selectedColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"#FF4081"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SelectColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SelectedColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two attributes. Done. The generator handles the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugin System
&lt;/h3&gt;

&lt;p&gt;The solution is split into 3 projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SimpleAnimate.Core    → Models, interfaces, services (zero WPF refs)
SimpleAnimate.Plugins → IPlugin contract + loader
SimpleAnimate         → Thin WPF shell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plugins reference only Core and implement &lt;code&gt;IPlugin.Configure(IServiceCollection)&lt;/code&gt;. Drop a DLL in the &lt;code&gt;plugins/&lt;/code&gt; folder and it's loaded at startup. This keeps the door open for community extensions without touching the main app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Undo Everything
&lt;/h3&gt;

&lt;p&gt;Every canvas mutation creates an &lt;code&gt;IUndoableAction&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MoveAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oldX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oldY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;_undoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Ctrl+Z → action.Undo() restores the old position&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Classic dual-stack (undo/redo). Kids mash buttons — undo must always be there.&lt;/p&gt;

&lt;h2&gt;
  
  
  UX Decisions Worth Noting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Color, not text&lt;/strong&gt; — the toolbar uses colored backgrounds to group tools. Shapes are on colored buttons matching the app's palette. No labels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame timeline is visual&lt;/strong&gt; — frame thumbnails at the bottom, not a number list. Tap to edit, big + button to add.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FPS control is just ➖ and ➕&lt;/strong&gt; — no slider, no textbox. Minus and plus buttons with a number between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Export
&lt;/h2&gt;

&lt;p&gt;Export renders each frame to PNG via WPF's &lt;code&gt;RenderTargetBitmap&lt;/code&gt;, then pipes them through ffmpeg to produce an MP4. A progress window shows real-time status by parsing ffmpeg's &lt;code&gt;frame=N&lt;/code&gt; output with regex.&lt;/p&gt;

&lt;p&gt;The app auto-discovers ffmpeg from PATH or common install locations. No ffmpeg? Everything else still works — you just can't export video.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="https://github.com/n-92/AnimateLI5/releases/tag/v1.0.0" rel="noopener noreferrer"&gt;AnimateLI5 v1.0.0&lt;/a&gt; (Windows, 64-bit, self-contained — no .NET install needed)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/n-92/AnimateLI5" rel="noopener noreferrer"&gt;github.com/n-92/AnimateLI5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo Video:&lt;/strong&gt; &lt;a href="https://youtu.be/fbgR41_aDBQ" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Designing for kids is harder than designing for developers.&lt;/strong&gt; You can't fall back on text, tooltips, or documentation. Every affordance must be visual and immediate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Undo isn't optional — it's the most important feature.&lt;/strong&gt; Kids explore by clicking everything. Without undo, one wrong click means tears.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WPF is still perfectly fine for desktop tools.&lt;/strong&gt; The ecosystem is mature, the tooling works, and a self-contained single-file publish produces a clean distributable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Source generators changed C# MVVM.&lt;/strong&gt; CommunityToolkit.Mvvm eliminates the tedium that made MVVM feel heavy. Two attributes replace dozens of boilerplate lines.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;AnimateLI5 is MIT licensed. Contributions welcome — especially if you have ideas for making it even simpler.&lt;/p&gt;

&lt;p&gt;If you've got a young kid who likes to draw and animate, give it a try and let me know how it goes. 🎨&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>dotnet</category>
      <category>animation</category>
    </item>
    <item>
      <title>Nanoshot has officially replaced Greenshot on my PC</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Thu, 19 Mar 2026 02:22:50 +0000</pubDate>
      <link>https://dev.to/n92/nanoshot-has-officially-replaced-greenshot-on-my-pc-5a49</link>
      <guid>https://dev.to/n92/nanoshot-has-officially-replaced-greenshot-on-my-pc-5a49</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Echoes of Experience&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Why I Finally Ditched Greenshot for a Tool I Built Myself: Meet NanoShot!
&lt;/h2&gt;

&lt;p&gt;For years, Picpick and Greenshot were my go-to screenshot tools. They were reliable, familiar, and got the job done. But as developers, we constantly crave tools that are faster, leaner, and perfectly tailored to our specific workflows. I wanted something that felt invisible until the exact moment I needed it—without the bloat.&lt;/p&gt;

&lt;p&gt;So, I decided to stop searching and start coding.&lt;/p&gt;

&lt;p&gt;Today, I’m thrilled to announce that my own creation, &lt;strong&gt;&lt;a href="https://github.com/n-92/NanoShot" rel="noopener noreferrer"&gt;NanoShot&lt;/a&gt;&lt;/strong&gt;, has officially replaced Greenshot as my primary daily driver! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ What is NanoShot?
&lt;/h2&gt;

&lt;p&gt;NanoShot is a blazing-fast, system-tray-resident screenshot and editor tool for Windows. I wrote it in &lt;strong&gt;pure C (C99)&lt;/strong&gt; utilizing the &lt;strong&gt;Win32 API&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The result? An incredibly lightweight executable that clocks in at &lt;strong&gt;~50 KB&lt;/strong&gt; with &lt;em&gt;zero&lt;/em&gt; heavy external dependencies. It’s lightning fast, brutally efficient, and permanently ready.&lt;/p&gt;

&lt;p&gt;Samples&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%2F2d7vyxpb4p0shjchoix3.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%2F2d7vyxpb4p0shjchoix3.png" alt=" " width="239" height="345"&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%2Fod75we82291vljpf2xei.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%2Fod75we82291vljpf2xei.png" alt=" " width="255" height="363"&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%2Fbzqyjwp2a9o9qz5bnzq6.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%2Fbzqyjwp2a9o9qz5bnzq6.png" alt=" " width="493" height="444"&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%2F2qrw1do38r5u34yckjsg.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%2F2qrw1do38r5u34yckjsg.png" alt=" " width="483" height="441"&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%2F9hytwa5pqy6w2mrozc1d.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%2F9hytwa5pqy6w2mrozc1d.png" alt=" " width="475" height="248"&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%2Fghslblvloxjmfflud8gy.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%2Fghslblvloxjmfflud8gy.png" alt=" " width="465" height="232"&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%2F52e5utlwd5ddl6xitrw1.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%2F52e5utlwd5ddl6xitrw1.png" alt=" " width="461" height="241"&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%2Fdvaqfhhns8504tk09bpk.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%2Fdvaqfhhns8504tk09bpk.png" alt=" " width="460" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Why It Won Me Over (The Unique Features)
&lt;/h2&gt;

&lt;p&gt;I didn't just want to clone existing tools; I wanted to optimize my specific workflow and add a few superpowers along the way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;🪶 Unbelievably Lightweight:&lt;/strong&gt; At roughly 50 KB, it uses practically zero system resources while running silently in your system tray. &lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🕵️ Built-in Privacy Protection:&lt;/strong&gt; Capturing screenshots often means accidentally grabbing sensitive data. NanoShot features a built-in Editor Canvas that instantly lets you draw rectangles to &lt;strong&gt;pixelate/blur&lt;/strong&gt; credentials, faces, or sensitive text before copying.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🖼️ Sobel Edge Detection:&lt;/strong&gt; This is my favorite unique feature! By hitting &lt;code&gt;Ctrl + Shift + PrintScreen&lt;/code&gt;, you can capture a screen region with real-time &lt;strong&gt;Sobel edge detection&lt;/strong&gt; applied. Perfect for extracting UI layouts, highlighting borders, or just getting a creative, stylized structural view of your screen.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;⚡ Frictionless Workflow:&lt;/strong&gt; Hitting &lt;code&gt;Ctrl + PrintScreen&lt;/code&gt; freezes the screen for capture. Once you're done editing/blurring, hitting &lt;code&gt;Enter&lt;/code&gt;, &lt;code&gt;Space&lt;/code&gt;, or simply &lt;strong&gt;double-clicking&lt;/strong&gt; the image instantly sends it to your clipboard.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;⚙️ Zero-Config Auto-Start:&lt;/strong&gt; Run it once, and it automatically registers itself in the Windows startup registry. It’s always there, always ready, and requires absolutely zero maintenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 The Takeaway
&lt;/h2&gt;

&lt;p&gt;Building NanoShot reminded me of why I love software engineering. Sometimes the best way to solve a minor daily annoyance is to engineer a bespoke solution from the ground up. It’s an incredibly rewarding feeling to use a tool hundreds of times a day and know exactly how every single byte of it works under the hood.&lt;/p&gt;

&lt;p&gt;If you love minimalist, high-performance utilities and want an insanely fast screenshot tool for Windows, I invite you to give it a spin!&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/n-92/NanoShot" rel="noopener noreferrer"&gt;Check out the NanoShot Repository on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you ever replaced a daily-driver application with something you built yourself? Let me know in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>wecoded</category>
      <category>dei</category>
      <category>career</category>
    </item>
    <item>
      <title>Meet NanoPdf Editor</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Thu, 19 Mar 2026 02:04:01 +0000</pubDate>
      <link>https://dev.to/n92/meet-nanopdf-editor-213a</link>
      <guid>https://dev.to/n92/meet-nanopdf-editor-213a</guid>
      <description>&lt;p&gt;Do you still remember the good old days around the year 2007 when you didn't have to worry about subscription and cloud mess for desktop based applications? Those good old days where desktop based applications just acted like they were meant to work without the internet. I still remember being able to edit PDF files directly using the free version of Adobe. Since then, things have changed and it is all about subscriptions and dependencies towards the ecosystems of the giants. &lt;/p&gt;

&lt;p&gt;I had been sitting down writing my own little pdf editor for Windows which I humbly call NanoPDF editor. It does one thing only and it does it really well -to edit PDFs. It has worked well for me so far with a wide range of PDF files that I have tested and I would humbly like to sell this software for just 10 USD for a life time license. You make the payment and I will send you the download link within 24hrs. It is that simple. &lt;/p&gt;

&lt;p&gt;A demo can be found on youtube of how it works. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=r2GJ-g69mqs" rel="noopener noreferrer"&gt;NanoPdf Editor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uniktek.tech/nanopdf-purchase.html" rel="noopener noreferrer"&gt;Purchase Link &lt;/a&gt;&lt;/p&gt;

</description>
      <category>news</category>
      <category>pdf</category>
      <category>microsoft</category>
      <category>productivity</category>
    </item>
    <item>
      <title>NanoShot</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Sat, 07 Mar 2026 14:55:17 +0000</pubDate>
      <link>https://dev.to/n92/nanoshot-1db5</link>
      <guid>https://dev.to/n92/nanoshot-1db5</guid>
      <description>&lt;p&gt;A lightweight, system-tray-resident screenshot &amp;amp; editor tool for Windows, written in pure C with the Win32 API.&lt;/p&gt;

&lt;p&gt;Samples&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%2F2d7vyxpb4p0shjchoix3.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%2F2d7vyxpb4p0shjchoix3.png" alt=" " width="239" height="345"&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%2Fod75we82291vljpf2xei.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%2Fod75we82291vljpf2xei.png" alt=" " width="255" height="363"&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%2Fbzqyjwp2a9o9qz5bnzq6.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%2Fbzqyjwp2a9o9qz5bnzq6.png" alt=" " width="493" height="444"&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%2F2qrw1do38r5u34yckjsg.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%2F2qrw1do38r5u34yckjsg.png" alt=" " width="483" height="441"&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%2F9hytwa5pqy6w2mrozc1d.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%2F9hytwa5pqy6w2mrozc1d.png" alt=" " width="475" height="248"&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%2Fghslblvloxjmfflud8gy.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%2Fghslblvloxjmfflud8gy.png" alt=" " width="465" height="232"&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%2F52e5utlwd5ddl6xitrw1.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%2F52e5utlwd5ddl6xitrw1.png" alt=" " width="461" height="241"&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%2Fdvaqfhhns8504tk09bpk.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%2Fdvaqfhhns8504tk09bpk.png" alt=" " width="460" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/n-92/NanoShot/releases/download/v1.0.0/nanoshot.exe" rel="noopener noreferrer"&gt;v1.0.0 Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/n-92/NanoShot/releases/download/v1.0.0/nanoshot.exe" rel="noopener noreferrer"&gt;v1.0.0 Download&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Disk Octopus: AI-Powered Terminal Storage Analytics Built with GitHub Copilot CLI</title>
      <dc:creator>Naing Oo</dc:creator>
      <pubDate>Tue, 03 Feb 2026 19:03:30 +0000</pubDate>
      <link>https://dev.to/n92/disk-octopus-ai-powered-terminal-storage-analytics-built-with-github-copilot-cli-4fe</link>
      <guid>https://dev.to/n92/disk-octopus-ai-powered-terminal-storage-analytics-built-with-github-copilot-cli-4fe</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Disk Octopus&lt;/strong&gt; - Intelligent Storage Analytics powered by AI&lt;/p&gt;

&lt;p&gt;I built a professional-grade terminal application that transforms how users analyze and understand their disk storage. Disk Octopus combines sophisticated file system visualization with AI-powered analysis to provide deep insights into storage usage patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features Built:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🖥️ Interactive Terminal UI&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Split-panel interface with resizable sections using Textual framework&lt;/li&gt;
&lt;li&gt;Beautiful braille octopus ASCII art for visual appeal&lt;/li&gt;
&lt;li&gt;Real-time file tree with intelligent lazy-loading&lt;/li&gt;
&lt;li&gt;Status bar with progress tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📊 Advanced File Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recognition and categorization of 40+ file types (code, documents, media, config, specialized formats)&lt;/li&gt;
&lt;li&gt;Real-time file type statistics and storage distribution analysis&lt;/li&gt;
&lt;li&gt;File path indexing and searchable results&lt;/li&gt;
&lt;li&gt;Intelligent file complexity classification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🤖 AI-Powered Deep Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integration with GitHub Copilot CLI for enhanced file analysis&lt;/li&gt;
&lt;li&gt;Intelligent fallback analyzer using pattern-based analysis when Copilot unavailable&lt;/li&gt;
&lt;li&gt;Analysis of file purpose, usage context, creator information, and practical assessments&lt;/li&gt;
&lt;li&gt;Support for files up to 5MB with streaming analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⚡ Performance Optimizations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lazy-loading of directory trees for instant responsiveness&lt;/li&gt;
&lt;li&gt;Intelligent caching of analysis results&lt;/li&gt;
&lt;li&gt;Efficient terminal rendering with minimal CPU usage&lt;/li&gt;
&lt;li&gt;Async file scanning with real-time progress&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Architecture:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core&lt;/strong&gt;: Python 3.10+ with Textual TUI framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI&lt;/strong&gt;: Rich terminal formatting with CSS-based styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analysis&lt;/strong&gt;: Pattern-based intelligent analyzer + Copilot CLI integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File System&lt;/strong&gt;: Recursive directory scanning with size tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Processing&lt;/strong&gt;: Real-time statistics aggregation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why I Built This:
&lt;/h3&gt;

&lt;p&gt;Traditional disk analysis tools like WizTree are GUI-only and resource-intensive. Disk Octopus brings powerful storage analytics directly to the terminal - where developers work. The AI integration transforms generic file analysis into actionable insights about file purposes, storage patterns, and disk organization opportunities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Repository:&lt;/strong&gt; &lt;a href="https://github.com/n-92/Disk-Octopus" rel="noopener noreferrer"&gt;https://github.com/n-92/Disk-Octopus&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Splash Screen&lt;/strong&gt; - Welcoming interface with octopus branding&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%2Fskc6u3rydr2ew0jh828u.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%2Fskc6u3rydr2ew0jh828u.png" alt="Splash Screen" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main Analysis Interface&lt;/strong&gt; - Comprehensive disk visualization&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%2Fl7tt5o666smi1lnxmxxq.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%2Fl7tt5o666smi1lnxmxxq.png" alt="Main UI" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File Statistics&lt;/strong&gt; - Real-time storage distribution analysis&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%2Fm5v8xuotfty6j8h26o8r.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%2Fm5v8xuotfty6j8h26o8r.png" alt="Statistics" width="375" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copilot-Powered Analysis&lt;/strong&gt; - AI-generated file insights&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%2F6nm0rzli02hd9pui1fli.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%2F6nm0rzli02hd9pui1fli.png" alt="Copilot Analysis" width="389" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep Analysis Results&lt;/strong&gt; - Intelligent file categorization and assessment&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%2Fe8xsk04qlfphmztbdma5.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%2Fe8xsk04qlfphmztbdma5.png" alt="Deep Analysis" width="388" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File Paths Display&lt;/strong&gt; - Complete file indexing and organization&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%2F4ro7r6rv1at9tit9dwv3.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%2F4ro7r6rv1at9tit9dwv3.png" alt="File Paths" width="380" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Start:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and setup&lt;/span&gt;
git clone https://github.com/n-92/Disk-Octopus.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Disk-Octopus
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Run&lt;/span&gt;
python main.py

&lt;span class="c"&gt;# Navigate with arrow keys, press 'd' for deep analysis, 'q' to quit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Keyboard Shortcuts:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;q&lt;/code&gt; - Quit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h&lt;/code&gt; - Help menu&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;d&lt;/code&gt; - Deep file analysis with Copilot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a&lt;/code&gt; - Quick file type analysis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;s&lt;/code&gt; - Show statistics&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;↑/↓&lt;/code&gt; - Navigate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How I Used Copilot CLI:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Deep File Analysis Integration&lt;/strong&gt;&lt;br&gt;
I integrated GitHub Copilot CLI to analyze file contents and generate intelligent commentary. The challenge was that subprocess calls with complex prompts would hang on Windows. I solved this by implementing an intelligent fallback analyzer that uses pattern-based analysis, while still leveraging Copilot when available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Problem-Solving for Complex Issues&lt;/strong&gt;&lt;br&gt;
When deep analysis wasn't working (files showing "Uploading... Please Wait" indefinitely), I used Copilot to help debug the subprocess hanging issue. This led me to discover PowerShell argument parsing limitations and implement a robust fallback mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Development Acceleration&lt;/strong&gt;&lt;br&gt;
Copilot CLI helped me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate analysis frameworks for file categorization&lt;/li&gt;
&lt;li&gt;Create intelligent fallback logic for when Copilot is unavailable&lt;/li&gt;
&lt;li&gt;Develop comprehensive file type recognition across 40+ formats&lt;/li&gt;
&lt;li&gt;Debug threading and async issues with terminal UI updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Impact on Development Experience:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Positive Impacts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Reduced debugging time for complex subprocess issues&lt;/li&gt;
&lt;li&gt;✅ Accelerated implementation of file type detection system&lt;/li&gt;
&lt;li&gt;✅ Helped design the intelligent fallback analyzer architecture&lt;/li&gt;
&lt;li&gt;✅ Provided pattern suggestions for file analysis frameworks&lt;/li&gt;
&lt;li&gt;✅ Enhanced code quality through intelligent suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technical Achievements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built a production-ready terminal application with advanced features&lt;/li&gt;
&lt;li&gt;Implemented robust error handling and fallback mechanisms&lt;/li&gt;
&lt;li&gt;Created 40+ file type recognition system&lt;/li&gt;
&lt;li&gt;Achieved seamless Copilot integration with graceful degradation&lt;/li&gt;
&lt;li&gt;Delivered comprehensive documentation and user guides&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Learning:&lt;/strong&gt;&lt;br&gt;
The biggest insight was designing systems that gracefully degrade when external services (like Copilot CLI) are unavailable. This approach made the application more robust and user-friendly, as it works perfectly even without Copilot while providing enhanced features when available.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copilot CLI Integration Details:
&lt;/h3&gt;

&lt;p&gt;The application automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detects if Copilot CLI is installed&lt;/li&gt;
&lt;li&gt;Attempts analysis via Copilot when available&lt;/li&gt;
&lt;li&gt;Falls back to intelligent pattern-based analysis if not&lt;/li&gt;
&lt;li&gt;Shows users which analysis method was used&lt;/li&gt;
&lt;li&gt;Provides meaningful insights either way&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This design philosophy made Disk Octopus inclusive for all users, regardless of their GitHub Copilot subscription status.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Professional Quality&lt;/strong&gt;: Production-ready code with clean architecture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform&lt;/strong&gt;: Works on Windows, macOS, and Linux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Well-Documented&lt;/strong&gt;: Comprehensive README with screenshots and setup guides&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-Friendly&lt;/strong&gt;: Intuitive keyboard navigation and clear help system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Source&lt;/strong&gt;: MIT licensed, ready for community contributions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust&lt;/strong&gt;: Handles large directories and files gracefully&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Version:&lt;/strong&gt; 1.0.0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; N-92&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Technologies:&lt;/strong&gt; Python 3.10+, Textual, Rich, GitHub Copilot CLI&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/n-92/Disk-Octopus" rel="noopener noreferrer"&gt;https://github.com/n-92/Disk-Octopus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special Thanks:&lt;/strong&gt; GitHub Copilot CLI for intelligent code assistance and analysis acceleration.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
