<?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: Mu Micro</title>
    <description>The latest articles on DEV Community by Mu Micro (@mumicrotools).</description>
    <link>https://dev.to/mumicrotools</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%2F3923619%2F6c757b8b-218e-4fd7-ab35-6cc598405e42.png</url>
      <title>DEV Community: Mu Micro</title>
      <link>https://dev.to/mumicrotools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mumicrotools"/>
    <language>en</language>
    <item>
      <title>git stash list gives you cryptic IDs — so I built stashpick</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Thu, 28 May 2026 10:39:55 +0000</pubDate>
      <link>https://dev.to/mumicrotools/git-stash-list-gives-you-cryptic-ids-so-i-built-stashpick-1989</link>
      <guid>https://dev.to/mumicrotools/git-stash-list-gives-you-cryptic-ids-so-i-built-stashpick-1989</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Running git stash list gives you cryptic stash@{N} IDs and terse messages; recovering the right stash means running git stash show -p stash@{N} for each candidate until you find what you need.&lt;/p&gt;

&lt;p&gt;If you've hit this, you know the drill — &lt;code&gt;git stash list&lt;/code&gt;, squint at the messages, run &lt;code&gt;git stash show -p stash@{2}&lt;/code&gt;, repeat.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;stashpick&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Interactive arrow-key git stash browser — preview diffs and apply, pop, or drop stashes without memorizing stash IDs&lt;/p&gt;

&lt;p&gt;Zero dependencies. Run immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx stashpick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npx stashpick
&lt;span class="go"&gt;
 stashpick  3 stashes                          a=apply  p=pop  d=drop  q=quit
 ref           date        message              │ diff preview
──────────────────────────────────────────────────────────────────────────────
▶ stash@{0}   2026-05-27  WIP on main: login   │ diff --git a/src/auth.js b/src/auth.js
  stash@{1}   2026-05-24  feat: refactor api   │ @@ -12,6 +18 @@
  stash@{2}   2026-05-20  quick css tweak      │ +  async login(email, password) {
                                                │ +    const res = await fetch("/api/auth"
──────────────────────────────────────────────────────────────────────────────
 1/3  stash@{0}  WIP on main: login form
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Pure Node.js: shells out to git stash list and git stash show -p via child_process, caches diff output per stash, and renders a two-pane terminal UI using raw ANSI escape codes and readline raw mode — zero npm dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found repeated complaints on r/git and HN about losing stash contents — developers stash work, forget what is in each one, and end up cherry-picking blindly or abandoning stashes entirely. Existing solutions like lazygit are full git UIs requiring separate installation; no zero-dependency npx tool fills the gap of a focused, single-purpose stash browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx stashpick &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day. All tools are zero-dependency Node.js.&lt;/p&gt;

</description>
      <category>git</category>
      <category>node</category>
      <category>devtools</category>
      <category>cli</category>
    </item>
    <item>
      <title>TypeScript 5 Utility Types Cheatsheet — One Page, 28 Items</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Thu, 28 May 2026 01:37:23 +0000</pubDate>
      <link>https://dev.to/mumicrotools/typescript-5-utility-types-cheatsheet-one-page-28-items-124b</link>
      <guid>https://dev.to/mumicrotools/typescript-5-utility-types-cheatsheet-one-page-28-items-124b</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every time I use TypeScript, I forget the same utility type patterns mid-project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserPreview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MaybeUser&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Events&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`on&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Capitalize&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Unwrapped&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Awaited&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;// → User&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Get the PDF
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://anishpunati.github.io/cheatsheets/" rel="noopener noreferrer"&gt;Free download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;New cheatsheet every day.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I was drowning in stale git branches, so I built an interactive TUI to bulk-delete them</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Thu, 28 May 2026 00:41:48 +0000</pubDate>
      <link>https://dev.to/mumicrotools/i-was-drowning-in-stale-git-branches-so-i-built-an-interactive-tui-to-bulk-delete-them-15h2</link>
      <guid>https://dev.to/mumicrotools/i-was-drowning-in-stale-git-branches-so-i-built-an-interactive-tui-to-bulk-delete-them-15h2</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Developers accumulate dozens of stale local git branches and cleaning them up requires manually running git log --merged, inspecting each branch, and issuing git branch -d repeatedly — there is no fast interactive way to review and bulk-delete branches in one pass.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know how it goes — you run &lt;code&gt;git branch&lt;/code&gt;, see 40+ branches, and start manually checking which ones are merged before issuing &lt;code&gt;git branch -d&lt;/code&gt; one at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;branch-cleaner&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Interactively browse and delete stale git branches with arrow keys — see merge status, age, and last commit at a glance&lt;/p&gt;

&lt;p&gt;It's zero-dependency Node.js, so you can run it immediately without installing anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx branch-cleaner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What you see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  branch-cleaner  UP/DOWN navigate  d mark  Enter delete  r refresh  q quit
  feat/auth-refactor    42d  merged   add JWT refresh logic
  fix/login-redirect    38d  merged   redirect after oauth callback
  feat/payment-v2       15d  unmerged WIP: stripe webhook handler
  main (current)         0d  merged   release v2.4.1

  2 branches marked for deletion. Press Enter to confirm.
  Deleted 2 branches.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Pure Node.js using child_process.execSync to call git branch -v --sort=-committerdate and git branch --merged, then renders a live arrow-key-navigable list with ANSI escape codes and raw terminal mode — zero dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found this recurring complaint on r/git and r/webdev — developers with long-running projects end up with 30-60 local branches after a few months and the git branch -d workflow is tedious. Tools like git-branch-pruner exist on npm but they batch-delete without showing you what you are removing. An interactive TUI where you can see merge status and age side-by-side before confirming fills this gap cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx branch-cleaner &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day. All tools are zero-dependency Node.js and run instantly with &lt;code&gt;npx&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>git</category>
      <category>node</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>git stash list tells you nothing — so I built `stash-pick`</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Wed, 27 May 2026 12:06:56 +0000</pubDate>
      <link>https://dev.to/mumicrotools/git-stash-list-tells-you-nothing-so-i-built-stash-pick-2ohl</link>
      <guid>https://dev.to/mumicrotools/git-stash-list-tells-you-nothing-so-i-built-stash-pick-2ohl</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;git stash list only shows a cryptic index and branch name — you have to run a separate &lt;code&gt;git stash show -p stash@{N}&lt;/code&gt; just to see what is inside, and applying or dropping any stash means typing out the full reference by hand every time.&lt;/p&gt;

&lt;p&gt;If you have hit this before, you know the friction: you accumulate stashes, forget what is in them, and end up either applying the wrong one or never cleaning them up.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;stash-pick&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Browse, apply, pop, and drop git stashes interactively with arrow-key navigation and inline diff preview.&lt;/p&gt;

&lt;p&gt;Zero-dependency Node.js — run it instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx stash-pick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  stash-pick   ↑/↓ navigate   Enter apply   p pop   d drop   q quit
  ─────────────────────────────────────────────────────────────────
 ▶  stash@{0}  WIP on feature/auth: user token refresh logic
    stash@{1}  WIP on main: quick experiment with rate limiting
    stash@{2}  On fix/typo: README wording update

  Stat:
  src/auth/tokens.js  | 14 +++++++++-----
  src/middleware.js   |  6 +++---
  2 files changed, 11 insertions(+), 8 deletions(-)

  @@ -34,7 +34,10 @@ async function refreshToken(user) {
  -  const token = await fetchToken(user.id);
  +  const token = await fetchToken(user.id, { force: true });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Pure Node.js: &lt;code&gt;process.stdin&lt;/code&gt; raw mode + ANSI escape codes for the full-screen TUI. &lt;code&gt;child_process.execSync&lt;/code&gt; shells out to git for all stash operations. Zero runtime dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found repeated complaints on r/git and r/commandline about the friction of inspecting stashes before applying. Every developer has had the experience of &lt;code&gt;stash@{3}: WIP on main: something&lt;/code&gt; telling them nothing useful. Existing solutions like lazygit are full-blown TUI clients — there is no focused, zero-dep Node tool that does just this one thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx stash-pick &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day. All tools are zero-dependency Node.js.&lt;/p&gt;

</description>
      <category>git</category>
      <category>node</category>
      <category>devtools</category>
      <category>terminal</category>
    </item>
    <item>
      <title>JSON logs from pino/winston/bunyan are unreadable as raw text — so I built `json-log-dash`</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Mon, 25 May 2026 13:03:04 +0000</pubDate>
      <link>https://dev.to/mumicrotools/json-logs-from-pinowinstonbunyan-are-unreadable-as-raw-text-so-i-built-json-log-dash-56gf</link>
      <guid>https://dev.to/mumicrotools/json-logs-from-pinowinstonbunyan-are-unreadable-as-raw-text-so-i-built-json-log-dash-56gf</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;JSON-structured logs from node servers (pino, winston, bunyan) are unreadable as raw text — you end up piping through &lt;code&gt;jq&lt;/code&gt; one query at a time or squinting at minified lines, with no way to filter by level or expand nested fields without a paid cloud service.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know how it goes — you write a throwaway jq alias, copy the same pipeline from Stack Overflow, or just accept the pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;json-log-dash&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Spin up a local web dashboard to browse, filter, and inspect JSON log files.&lt;/p&gt;

&lt;p&gt;Zero-dependency Node.js, run it immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx json-log-dash server.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or pipe from a running process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node app.js | npx json-log-dash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;json-log-dash — 1,243 entries loaded

  Server: http://localhost:7777

  Press Enter to stop.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens a browser dashboard with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Level filter buttons (trace / debug / info / warn / error / fatal)&lt;/li&gt;
&lt;li&gt;Full-text search across all fields in every record&lt;/li&gt;
&lt;li&gt;Click any row to expand and see the full JSON with syntax highlighting&lt;/li&gt;
&lt;li&gt;Handles pino numeric levels, winston string levels, bunyan — normalised automatically&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Pure Node.js with no dependencies. Reads newline-delimited JSON with &lt;code&gt;readline&lt;/code&gt;, serves a self-contained HTML page via &lt;code&gt;http.createServer&lt;/code&gt; (port 7777), inlines all CSS and JS as a template literal, and opens the browser with &lt;code&gt;child_process.exec&lt;/code&gt;. The server shuts down after 60 seconds of inactivity or when you press Enter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found repeated complaints on r/node and Stack Overflow about pino/winston JSON logs being unreadable in the terminal. Tools like &lt;code&gt;pino-pretty&lt;/code&gt; only colorize the terminal — none provide a local browser UI with filtering and expandable records. No popular zero-dependency npm package fills this gap.&lt;/p&gt;




&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day.&lt;/p&gt;

</description>
      <category>node</category>
      <category>devtools</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Developers lose track of which ports are in use — so I built portmap</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Mon, 25 May 2026 00:34:47 +0000</pubDate>
      <link>https://dev.to/mumicrotools/developers-lose-track-of-which-ports-are-in-use-so-i-built-portmap-24hn</link>
      <guid>https://dev.to/mumicrotools/developers-lose-track-of-which-ports-are-in-use-so-i-built-portmap-24hn</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Developers running multiple local services — API servers, databases, webpack dev servers — frequently need to know what is listening on which port, but running lsof -iTCP -sTCP:LISTEN or netstat -an produces walls of unformatted text that are slow to read and impossible to scan at a glance.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know how it goes — you cycle through terminal tabs running &lt;code&gt;lsof -iTCP -sTCP:LISTEN -n -P&lt;/code&gt;, squinting at the output, trying to find the process on port 3000.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;portmap&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Scan all listening ports on localhost and visualise them in a browser dashboard with process names and PIDs&lt;/p&gt;

&lt;p&gt;Zero-dependency Node.js, so you can run it immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx portmap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output in terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;portmap dashboard → http://127.0.0.1:7777
Press Enter to stop.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser opens a live dashboard:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Process&lt;/th&gt;
&lt;th&gt;PID&lt;/th&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3000&lt;/td&gt;
&lt;td&gt;node&lt;/td&gt;
&lt;td&gt;14321&lt;/td&gt;
&lt;td&gt;*:3000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5432&lt;/td&gt;
&lt;td&gt;postgres&lt;/td&gt;
&lt;td&gt;1892&lt;/td&gt;
&lt;td&gt;127.0.0.1:5432&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6379&lt;/td&gt;
&lt;td&gt;redis-ser&lt;/td&gt;
&lt;td&gt;2104&lt;/td&gt;
&lt;td&gt;127.0.0.1:6379&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8080&lt;/td&gt;
&lt;td&gt;python3&lt;/td&gt;
&lt;td&gt;19834&lt;/td&gt;
&lt;td&gt;*:8080&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hit Refresh to rescan. Press Enter in the terminal to stop. Auto-closes after 60s.&lt;/p&gt;

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

&lt;p&gt;Uses Node.js child_process.execSync to run lsof -iTCP -sTCP:LISTEN -n -P (macOS/Linux) or netstat -ano (Windows), parses port/PID/process-name triples with regex, then serves a self-contained HTML dashboard via the built-in http module and opens the browser automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found the complaint repeatedly on r/webdev and r/node — developers juggling Postgres, Redis, a webpack server, and a Node API all at once constantly type lsof or netstat and squint at the output. No popular zero-dep Node.js tool presents this data visually. A local web dashboard is a natural fit: the output is tabular, colour and typography help enormously, and auto-closing keeps it lightweight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx portmap &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day. All tools are zero-dependency Node.js and run instantly with &lt;code&gt;npx&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Bundle size creep goes unnoticed until PR review — so I built `buildwatch`</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Fri, 22 May 2026 12:45:45 +0000</pubDate>
      <link>https://dev.to/mumicrotools/bundle-size-creep-goes-unnoticed-until-pr-review-so-i-built-buildwatch-52im</link>
      <guid>https://dev.to/mumicrotools/bundle-size-creep-goes-unnoticed-until-pr-review-so-i-built-buildwatch-52im</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;During development, bundle size creep goes unnoticed — there is no fast way to see that a code change just added 50 KB to your dist folder until it surfaces in a PR review or a production performance regression.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know how it goes — you end up finding out during a PR review, or worse, after a production deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;buildwatch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Watch your build output directory and report file size changes on every rebuild&lt;/p&gt;

&lt;p&gt;It's zero-dependency Node.js, so you can run it immediately without installing anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx buildwatch ./dist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;buildwatch v1.0.0
Watching /projects/myapp/dist
Initial state: 3 files, 1.0 MB total

[10:23:41] 2 files changed

  main.js          136.4 KB  +12.1 KB (+9.7%)
  main.css           8.3 KB  +0.1 KB (+1.2%)
  vendor.js        892.1 KB  no change

  Total: 1,036.8 KB  +12.2 KB (+1.2%)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Pure Node.js using fs.watch() for directory monitoring and fs.stat() for file sizes, with 300ms debouncing to handle rapid build events, printing ANSI-colored per-file and total size deltas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found repeated complaints in r/webdev and r/node about not noticing bundle size regressions until PR review or production. Existing tools like bundlesize and size-limit require CI config changes or build plugin integration. No popular zero-dep tool gives you instant terminal feedback during local development — a file watcher that just runs alongside your dev server fills this gap cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx buildwatch &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day. All tools are zero-dependency Node.js and run instantly with &lt;code&gt;npx&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>devtools</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>When a port is already in use, there is no interactive way to find it — so I built `port-peek`</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Thu, 21 May 2026 12:35:32 +0000</pubDate>
      <link>https://dev.to/mumicrotools/when-a-port-is-already-in-use-there-is-no-interactive-way-to-find-it-so-i-built-port-peek-mo5</link>
      <guid>https://dev.to/mumicrotools/when-a-port-is-already-in-use-there-is-no-interactive-way-to-find-it-so-i-built-port-peek-mo5</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;When a port is already in use, developers have to chain together lsof, grep, and kill commands to find and stop the offending process — there is no interactive way to scan all listening ports and act on them in one place.&lt;/p&gt;

&lt;p&gt;If you've hit &lt;code&gt;EADDRINUSE :::3000&lt;/code&gt; before, you know the ritual: &lt;code&gt;lsof -i :3000&lt;/code&gt;, then grep, then kill. Every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;port-peek&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Interactive TUI for browsing all listening ports and killing the process behind any port with a keypress&lt;/p&gt;

&lt;p&gt;Zero dependencies. Run it immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx port-peek
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;port-peek v1.0.0 — Listening ports

  PORT    PID       PROCESS
  3000    91234     node
▶ 5432    823       postgres
  8080    45612     python3
  8888    45990     node

  ↑↓ navigate  Enter kill  r refresh  q quit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arrow keys to navigate, Enter to kill, r to refresh.&lt;/p&gt;

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

&lt;p&gt;Pure Node.js using child_process.execSync to run lsof -iTCP -sTCP:LISTEN on macOS (with ss/netstat fallback on Linux), then renders a full-screen ANSI TUI with raw mode stdin for arrow-key navigation and Enter-to-kill. No dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found recurring complaints on r/node and r/webdev about the EADDRINUSE error forcing multi-step shell rituals to find and kill the blocking process. The top Stack Overflow answer for 'kill process on port' has millions of views, confirming this is an extremely common pain point. No popular zero-dep npm package provides an interactive alternative — they are all one-shot kill commands that require you to know the port number upfront. An interactive TUI felt like the right format because developers often want to survey all listening ports before deciding which to kill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx port-peek &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day.&lt;/p&gt;

</description>
      <category>node</category>
      <category>cli</category>
      <category>devtools</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Cron expressions are hard to verify — so I built `croncheck`</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Wed, 20 May 2026 12:06:49 +0000</pubDate>
      <link>https://dev.to/mumicrotools/cron-expressions-are-hard-to-verify-so-i-built-croncheck-k2i</link>
      <guid>https://dev.to/mumicrotools/cron-expressions-are-hard-to-verify-so-i-built-croncheck-k2i</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Cron syntax is notoriously hard to verify — developers copy expressions from Stack Overflow or write their own, then paste them into random online parsers to check them, often without offline access or confidence in edge-case handling.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know how it goes — you fire up a browser tab, paste the expression into crontab.guru, and hope it interprets edge cases the same way your cron daemon does.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;croncheck&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Parse and preview cron expressions interactively — see the next 10 run times before you deploy&lt;/p&gt;

&lt;p&gt;It's zero-dependency Node.js, so you can run it immediately without installing anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx croncheck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;croncheck "30 9 * * 1-5"

  Expression: 30 9 * * 1-5
  Meaning:    minute 30, hour 9, every day, every month, weekdays 1-5

  Next 10 run times:
   1. Mon May 25 2026  09:30  in 4d 23h
   2. Tue May 26 2026  09:30  in 5d 23h
   3. Wed May 27 2026  09:30  in 6d 23h
   4. Thu May 28 2026  09:30  in 7d 23h
   5. Fri May 29 2026  09:30  in 8d 23h
   6. Mon Jun  1 2026  09:30  in 11d 23h
   7. Tue Jun  2 2026  09:30  in 12d 23h
   8. Wed Jun  3 2026  09:30  in 13d 23h
   9. Thu Jun  4 2026  09:30  in 14d 23h
  10. Fri Jun  5 2026  09:30  in 15d 23h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Pure Node.js cron parser that expands each field (minute, hour, day, month, weekday) into a sorted array of valid values using set arithmetic, then advances a Date object forward one minute at a time to collect the next N matching timestamps, rendered in a raw-mode terminal UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found repeated complaints on r/devops and HN from developers who deployed broken cron schedules after writing expressions from memory. Online tools like crontab.guru exist but require a browser and fail offline. No popular zero-dep npx tool fills the gap for quick in-terminal verification before committing a schedule to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx croncheck &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day. All tools are zero-dependency Node.js and run instantly with &lt;code&gt;npx&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>devops</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Developers keep pasting JSON into online formatters and leaking secrets — so I built json-explorer</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Tue, 19 May 2026 23:21:13 +0000</pubDate>
      <link>https://dev.to/mumicrotools/developers-keep-pasting-json-into-online-formatters-and-leaking-secrets-so-i-built-json-explorer-43oa</link>
      <guid>https://dev.to/mumicrotools/developers-keep-pasting-json-into-online-formatters-and-leaking-secrets-so-i-built-json-explorer-43oa</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Debugging large or deeply nested JSON responses means pasting into online formatters (a privacy risk), squinting at jq output, or writing throwaway scripts — there is no instant zero-setup local tool that gives you a rich interactive view.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know the friction — online formatters work but they upload your JSON to a third-party server. That's fine for public data; it's not fine for API responses containing auth tokens, PII, or internal service data.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created json-explorer
&lt;/h2&gt;

&lt;p&gt;Visualize any JSON file as an interactive collapsible tree in your browser — with search, path tracking, and copy-to-clipboard&lt;/p&gt;

&lt;p&gt;Zero dependencies. Run instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx json-explorer response.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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="nv"&gt;$ &lt;/span&gt;json-explorer response.json

json-explorer
  file:   /home/user/projects/api/response.json
  server: http://localhost:7777

Opening browser... press Enter to stop the server.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your browser opens to a polished local dashboard. The server only listens on localhost — nothing leaves your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Collapsible tree — top-level nodes open by default, deep nodes collapsed&lt;/li&gt;
&lt;li&gt;Live search — highlights matching keys and values, auto-expands parents&lt;/li&gt;
&lt;li&gt;Path display — hover any row to see its full dot/bracket path&lt;/li&gt;
&lt;li&gt;Copy to clipboard — copy any value or subtree as formatted JSON&lt;/li&gt;
&lt;li&gt;Expand all / collapse all buttons&lt;/li&gt;
&lt;li&gt;Auto-closes after 60 seconds (or press Enter)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Pure Node.js: reads the file, spins up an http.createServer on port 7777, serves a single self-contained HTML page with all CSS and JS inlined, then opens the default browser; server auto-closes after 60 seconds or on Enter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Developers routinely paste JSON into online formatters like jsonformatter.org or jsoneditoronline.org, leaking API responses and auth tokens to third-party servers. jq is powerful but requires learning a mini-language for ad-hoc inspection. No popular zero-dep npx tool fills the gap — a local-web-dashboard format is the right choice here because the entire value is in the visual presentation, not the data transformation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx json-explorer &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Developers keep pasting JSON into online formatters and leaking secrets — so I built json-explorer</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Tue, 19 May 2026 23:14:53 +0000</pubDate>
      <link>https://dev.to/mumicrotools/developers-keep-pasting-json-into-online-formatters-and-leaking-secrets-so-i-built-json-explorer-2a1p</link>
      <guid>https://dev.to/mumicrotools/developers-keep-pasting-json-into-online-formatters-and-leaking-secrets-so-i-built-json-explorer-2a1p</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Debugging large or deeply nested JSON responses means pasting into online formatters (a privacy risk), squinting at jq output, or writing throwaway scripts — there is no instant zero-setup local tool that gives you a rich interactive view.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know the friction — online formatters work but they upload your JSON to a third-party server. That's fine for public data; it's not fine for API responses containing auth tokens, PII, or internal service data.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created json-explorer
&lt;/h2&gt;

&lt;p&gt;Visualize any JSON file as an interactive collapsible tree in your browser — with search, path tracking, and copy-to-clipboard&lt;/p&gt;

&lt;p&gt;Zero dependencies. Run instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx json-explorer response.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;json-explorer response.json
&lt;span class="go"&gt;
json-explorer
  file:   /home/user/projects/api/response.json
  server: http://localhost:7777

Opening browser... press Enter to stop the server.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your browser opens to a polished local dashboard. The server only listens on localhost — nothing leaves your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Collapsible tree — top-level nodes open by default, deep nodes collapsed&lt;/li&gt;
&lt;li&gt;Live search — highlights matching keys and values, auto-expands parents&lt;/li&gt;
&lt;li&gt;Path display — hover any row to see its full dot/bracket path&lt;/li&gt;
&lt;li&gt;Copy to clipboard — copy any value or subtree as formatted JSON&lt;/li&gt;
&lt;li&gt;Expand all / collapse all buttons&lt;/li&gt;
&lt;li&gt;Auto-closes after 60 seconds (or press Enter)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Pure Node.js: reads the file, spins up an http.createServer on port 7777, serves a single self-contained HTML page with all CSS and JS inlined, then opens the default browser; server auto-closes after 60 seconds or on Enter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Developers routinely paste JSON into online formatters like jsonformatter.org or jsoneditoronline.org, leaking API responses and auth tokens to third-party servers. jq is powerful but requires learning a mini-language for ad-hoc inspection. No popular zero-dep npx tool fills the gap — a local-web-dashboard format is the right choice here because the entire value is in the visual presentation, not the data transformation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx json-explorer &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>JSON logs in your terminal are unreadable — so I built `jlog-watch`</title>
      <dc:creator>Mu Micro</dc:creator>
      <pubDate>Tue, 19 May 2026 17:51:36 +0000</pubDate>
      <link>https://dev.to/mumicrotools/json-logs-in-your-terminal-are-unreadable-so-i-built-jlog-watch-2dd8</link>
      <guid>https://dev.to/mumicrotools/json-logs-in-your-terminal-are-unreadable-so-i-built-jlog-watch-2dd8</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Structured JSON logs from frameworks like pino and bunyan are unreadable with tail -f — every line is a compact JSON blob with no color, no level emphasis, and no field alignment.&lt;/p&gt;

&lt;p&gt;If you've hit this before, you know how it goes — you end up installing pino-pretty globally, or just squinting at raw JSON blobs in the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a solution, I created &lt;code&gt;jlog-watch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Watch a JSON log file and pretty-print each new line with ANSI colors and aligned fields&lt;/p&gt;

&lt;p&gt;Zero dependencies. Run it immediately without installing anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx jlog-watch app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jlog-watch app.log
&lt;span class="go"&gt;● jlog-watch watching /project/app.log
Press Ctrl+C to stop

2026-05-19 04:00:01.412  INFO   server listening  port=3000
2026-05-19 04:00:02.118  DEBUG  incoming request  method=GET path=/health
2026-05-19 04:00:07.551  ERROR  unhandled exception  err={"code":"ECONNREFUSED"}
^C
──────────────────────────────────────────
Stopped.  errors seen: 1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Pure Node.js using fs.watchFile() for change detection, manual byte-position tracking to read only new bytes since the last event, JSON.parse per line, and ANSI escape codes for coloring — zero npm dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Found repeated complaints on r/node and r/devops about having to install pino-pretty or the bunyan CLI just to read your own app logs in development. Existing zero-dep alternatives either don't watch live files or require piping stdout rather than watching a persisted log file. A zero-dep file watcher that works on any JSON-per-line log file and shows clear ANSI output fills the gap cleanly without touching application code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx jlog-watch app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Part of &lt;a href="https://anishpunati.github.io/mumicro/" rel="noopener noreferrer"&gt;µ micro&lt;/a&gt; — one new developer tool, shipped every day. All tools are zero-dependency Node.js and run instantly with &lt;code&gt;npx&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>devtools</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
