<?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: Paras</title>
    <description>The latest articles on DEV Community by Paras (@parasraju).</description>
    <link>https://dev.to/parasraju</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4239457%2F8710536f-ee31-4f49-8d1c-03924d77d467.png</url>
      <title>DEV Community: Paras</title>
      <link>https://dev.to/parasraju</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/parasraju"/>
    <language>en</language>
    <item>
      <title>I'm Shipping 5 npm Packages to 10,000 Downloads</title>
      <dc:creator>Paras</dc:creator>
      <pubDate>Wed, 11 Nov 2026 17:59:05 +0000</pubDate>
      <link>https://dev.to/parasraju/im-shipping-5-npm-packages-to-10000-downloads-54ee</link>
      <guid>https://dev.to/parasraju/im-shipping-5-npm-packages-to-10000-downloads-54ee</guid>
      <description>&lt;h1&gt;
  
  
  I'm Shipping 5 npm Packages to 10,000 Downloads
&lt;/h1&gt;

&lt;p&gt;This is the first post in a series. The goal is simple: get my five npm packages to &lt;strong&gt;10,000 combined downloads&lt;/strong&gt; before the end of the year. I'm going to write about every step — what I ship, what works, what doesn't, and the real numbers.&lt;/p&gt;

&lt;p&gt;No growth hacks. No threads about "how I made $10k in a month." Just shipping, twice a day, and writing down what happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I started
&lt;/h2&gt;

&lt;p&gt;I have five packages. As of this morning (Nov 11), their combined downloads are &lt;strong&gt;4,153&lt;/strong&gt;. That leaves &lt;strong&gt;5,847&lt;/strong&gt; to go.&lt;/p&gt;

&lt;p&gt;The five:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;plumber-linter&lt;/strong&gt; — a CI/CD pipeline linter that flags hardcoded secrets, leaked credentials, and dead code, with fixes in plain English. &lt;strong&gt;1,340 downloads.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;environmental-peek&lt;/strong&gt; — safely inspect .env files without leaking secrets. Mask values, diff against .env.example, generate .env.example. &lt;strong&gt;962 downloads.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;hexlens&lt;/strong&gt; — a binary analysis tool. Parse PE, ELF, Mach-O, WASM, DEX and .NET, with strings, graphs, and now YARA rule scanning. &lt;strong&gt;840 downloads.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;react-dismiss&lt;/strong&gt; — a tiny React hook that dismisses dropdowns, popovers and modals on outside click or Escape. &lt;strong&gt;563 downloads.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/parasraju"&gt;@parasraju&lt;/a&gt;/plumber-mcp&lt;/strong&gt; — the plumber-linter engine as an MCP server, so AI coding tools can scan pipelines too. &lt;strong&gt;448 downloads.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned so far
&lt;/h2&gt;

&lt;p&gt;Downloads don't grow steadily. They &lt;strong&gt;spike on publish days and go flat otherwise&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The numbers from my own packages: a publish day spikes around 200 downloads. A flat day is 0 to 10 per package, 30 to 50 combined. It doesn't matter much whether the release is big or small — every publish spikes, even a bug-fix patch. The day after a publish there's a small tail, then it's back to flat.&lt;/p&gt;

&lt;p&gt;So the strategy writes itself: &lt;strong&gt;ship twice a day, every day&lt;/strong&gt;. One feature in the morning, one in the evening. Medium features, not just bug fixes. Every publish gets a version bump, a README touch-up, and better keywords, because ranking is part of shipping.&lt;/p&gt;

&lt;p&gt;The last two days proved it: +406 downloads one day, +397 the next, right after the twice-a-day shipping started.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules I'm playing by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update the existing five. No new tools.&lt;/strong&gt; New ideas are tempting, but five packages with real users beat ten half-built ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two ships a day, 11am and 9pm.&lt;/strong&gt; If I miss one, I do the next one. No doubling up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every ship is a real feature.&lt;/strong&gt; Not version bumps for the sake of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write about it.&lt;/strong&gt; That's what this series is.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this series will be
&lt;/h2&gt;

&lt;p&gt;Each post covers a ship or a lesson: what changed in the package, why, and what the numbers did after. The wins and the misses. When something breaks — and it will — I'll write about that too.&lt;/p&gt;

&lt;p&gt;If you build tools, ship packages, or you're trying to get your own project past the flat-days problem, follow along. And if you've used any of the five, try the latest version and tell me what it missed. That's the fastest way to make the next release better.&lt;/p&gt;

&lt;p&gt;The counter starts at &lt;strong&gt;4,153&lt;/strong&gt;. Let's see how fast it moves.&lt;/p&gt;




&lt;p&gt;🔗 &lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/%7Eparasraju" rel="noopener noreferrer"&gt;https://www.npmjs.com/~parasraju&lt;/a&gt;&lt;br&gt;
💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/parasraju" rel="noopener noreferrer"&gt;https://github.com/parasraju&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Part 1 of the series "Shipping 5 npm packages to 10k downloads".&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>npm</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Your CI/CD Pipeline Is the Easiest Way Into Your Repo (And Nobody's Checking It)</title>
      <dc:creator>Paras</dc:creator>
      <pubDate>Wed, 11 Nov 2026 16:18:51 +0000</pubDate>
      <link>https://dev.to/parasraju/your-cicd-pipeline-is-the-easiest-way-into-your-repo-and-nobodys-checking-it-21hj</link>
      <guid>https://dev.to/parasraju/your-cicd-pipeline-is-the-easiest-way-into-your-repo-and-nobodys-checking-it-21hj</guid>
      <description>&lt;h1&gt;
  
  
  Your CI/CD Pipeline Is the Easiest Way Into Your Repo (And Nobody's Checking It)
&lt;/h1&gt;

&lt;p&gt;Your code gets reviewed. Your dependencies get scanned. But your &lt;strong&gt;CI/CD pipeline&lt;/strong&gt; — the thing with access to your &lt;strong&gt;secrets&lt;/strong&gt;, your &lt;strong&gt;deployments&lt;/strong&gt;, and your &lt;strong&gt;production credentials&lt;/strong&gt; — usually gets copy-pasted from a tutorial and never looked at again.&lt;/p&gt;

&lt;p&gt;That's the gap &lt;strong&gt;plumber-linter&lt;/strong&gt; was built for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem hiding in plain sight
&lt;/h2&gt;

&lt;p&gt;Here's a workflow file that looks completely normal. It's also a &lt;strong&gt;security incident waiting to happen&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;push&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write-all&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;some-random-action/setup-node@main&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "Deploying..."&lt;/span&gt;
          &lt;span class="na"&gt;curl -H "Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer AKIAIOSFODNN7EXAMPLE" https://api.example.com/deploy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Three problems, zero warnings from your CI:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;permissions: write-all&lt;/code&gt;&lt;/strong&gt; — the workflow can do everything: push code, read secrets, modify releases. A compromised step inherits all of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An unpinned action (&lt;code&gt;@main&lt;/code&gt;)&lt;/strong&gt; — you're running whatever the maintainer pushes next, sight unseen. If that repo gets hijacked, so does your pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hardcoded secret in a run step&lt;/strong&gt; — it now lives in your git history forever, and anyone with repo access can read it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most teams find these during an incident review. &lt;strong&gt;plumber-linter finds them before that.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;plumber-linter scans your CI/CD pipeline configs — &lt;strong&gt;GitHub Actions&lt;/strong&gt; and &lt;strong&gt;GitLab CI&lt;/strong&gt; — and flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardcoded secrets&lt;/strong&gt; in workflow files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overly broad permissions&lt;/strong&gt; like &lt;code&gt;write-all&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpinned third-party actions&lt;/strong&gt; that can change under you&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing branch protections&lt;/strong&gt; that let unreviewed code straight into main&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And instead of cryptic rule IDs, it explains each finding in &lt;strong&gt;plain English&lt;/strong&gt; — what the risk actually is, and how to fix it. So even if you're not a security person, you know exactly what to change and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new in v1.2.0
&lt;/h2&gt;

&lt;p&gt;The latest release adds 5 new rules, and they cover the stuff I kept seeing in real repos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unpinned Docker images&lt;/strong&gt; — &lt;code&gt;image: node:latest&lt;/code&gt; in your workflow means your build changes whenever the image does. Pin it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;curl | bash&lt;/code&gt;&lt;/strong&gt; — piping a remote script straight into your shell in CI. If that server is compromised, your runner is too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;permissions: write-all&lt;/code&gt;&lt;/strong&gt; — now flagged as its own high-severity rule, not buried in a generic check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack webhooks in plain text&lt;/strong&gt; — a leaked webhook URL lets anyone post to your channel. It gets flagged the same way a leaked API key does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpinned npm packages in CI&lt;/strong&gt; — &lt;code&gt;npm install some-package@latest&lt;/code&gt; in a pipeline is the same unpinned-action problem, one layer down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That brings it to &lt;strong&gt;26 rules&lt;/strong&gt; total. One command, whole pipeline checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on your own repo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm install plumber-linter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





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

&lt;/div&gt;



&lt;p&gt;It takes seconds. If it comes back clean, good — your pipeline is in better shape than most. If it flags something embarrassing, that's the whole point. Fix it, and your next deploy is already safer than your last one.&lt;/p&gt;

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

&lt;p&gt;Pipeline security tools exist, but they're usually heavy, noisy, or written for security teams. I wanted something a regular developer could run in a minute and actually understand the output of. &lt;strong&gt;No 200-page report — just the real risks, explained like a person would explain them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;plumber-linter is at &lt;strong&gt;v1.2.0&lt;/strong&gt; now, with &lt;strong&gt;1,300+ downloads on npm&lt;/strong&gt; and counting. It's still early, and it's getting better with every release — if you run it on your repo and it catches something, or misses something it should have caught, I'd genuinely love to hear about it.&lt;/p&gt;

&lt;p&gt;Try it, break it, and tell me what it missed. &lt;strong&gt;Feedback welcome.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🔗 &lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/plumber-linter" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/plumber-linter&lt;/a&gt;&lt;br&gt;
🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://plumber-7dv.pages.dev/" rel="noopener noreferrer"&gt;https://plumber-7dv.pages.dev/&lt;/a&gt;&lt;br&gt;
💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/parasraju/plumber" rel="noopener noreferrer"&gt;https://github.com/parasraju/plumber&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built for GitHub Actions / GitLab CI. &lt;code&gt;npm install plumber-linter&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>cicd</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
