<?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: ke jia</title>
    <description>The latest articles on DEV Community by ke jia (@ke_jia_24bb2f9f84f14f728a).</description>
    <link>https://dev.to/ke_jia_24bb2f9f84f14f728a</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%2F3935917%2F2200f40f-1cab-4c01-b5b1-39e52ae90676.png</url>
      <title>DEV Community: ke jia</title>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ke_jia_24bb2f9f84f14f728a"/>
    <language>en</language>
    <item>
      <title>How to Set Up Your Entire Dev Workflow in 5 Minutes (With 4 Free CLI Tools)</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:52:36 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/how-to-set-up-your-entire-dev-workflow-in-5-minutes-with-4-free-cli-tools-45dg</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/how-to-set-up-your-entire-dev-workflow-in-5-minutes-with-4-free-cli-tools-45dg</guid>
      <description>&lt;h1&gt;
  
  
  How to Set Up Your Entire Dev Workflow in 5 Minutes (With 4 Free CLI Tools)
&lt;/h1&gt;

&lt;p&gt;Most developers spend their first hour on every new project doing setup: initializing git, creating configs, scanning for secrets, organizing snippets. What if you could automate all of that?&lt;/p&gt;

&lt;p&gt;Here's my exact workflow — four zero-dependency CLI tools that handle everything in under 5 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You start a new project. Here's what usually happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create directory, &lt;code&gt;npm init -y&lt;/code&gt;, install dependencies → &lt;strong&gt;5 min&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set up &lt;code&gt;.gitignore&lt;/code&gt;, &lt;code&gt;.eslintrc&lt;/code&gt;, &lt;code&gt;tsconfig.json&lt;/code&gt; → &lt;strong&gt;10 min&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Write boilerplate code → &lt;strong&gt;15 min&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Forget about &lt;code&gt;.env&lt;/code&gt; until someone commits API keys → &lt;strong&gt;production outage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Lose that perfect &lt;code&gt;docker run&lt;/code&gt; command you wrote last week → &lt;strong&gt;frustration&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Spend time analyzing git stats → &lt;strong&gt;open browser&lt;/strong&gt; (context switch!)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's 30+ minutes before you write a single line of business logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;Four tools. One workflow. Five minutes.&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="c"&gt;# Step 1: Generate project structure&lt;/span&gt;
npx scaffoldx-cli my-app &lt;span class="nt"&gt;--template&lt;/span&gt; react

&lt;span class="c"&gt;# Step 2: Scan for secrets&lt;/span&gt;
npx @wuchunjie/dotguard my-app

&lt;span class="c"&gt;# Step 3: Add your first code snippet&lt;/span&gt;
npx @wuchunjie/snippetx add &lt;span class="s2"&gt;"express middleware"&lt;/span&gt; &lt;span class="s2"&gt;"app.use(express.json())"&lt;/span&gt; js

&lt;span class="c"&gt;# Step 4: Check git health&lt;/span&gt;
npx @wuchunjie/gitpulse my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Total time:&lt;/strong&gt; ~3 minutes. Here's how each tool works and why they belong in every dev's toolkit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #1: ScaffoldX — Project Generation in Seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;scaffoldx-cli&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wuchunjie00/scaffoldx" rel="noopener noreferrer"&gt;wuchunjie00/scaffoldx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ScaffoldX generates production-ready project scaffolds from 12 templates. No &lt;code&gt;create-react-app&lt;/code&gt;, no &lt;code&gt;next create&lt;/code&gt;, no waiting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx scaffoldx-cli my-app &lt;span class="nt"&gt;--template&lt;/span&gt; express-api
&lt;span class="c"&gt;# Or interactive mode:&lt;/span&gt;
npx scaffoldx-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Available templates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React (Vite)&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Express API&lt;/li&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;SvelteKit&lt;/li&gt;
&lt;li&gt;Nuxt 3&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Remix&lt;/li&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;React Native&lt;/li&gt;
&lt;li&gt;Deno&lt;/li&gt;
&lt;li&gt;Monorepo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each template includes: TypeScript config, ESLint + Prettier, &lt;code&gt;.gitignore&lt;/code&gt;, &lt;code&gt;.env.example&lt;/code&gt;, &lt;code&gt;README.md&lt;/code&gt;, and a working &lt;code&gt;npm run dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero dependencies.&lt;/strong&gt; The CLI itself uses only Node.js built-in modules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #2: DotGuard — Security Before You Ship
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;@wuchunjie/dotguard&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;wuchunjie00/dotguard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After ScaffoldX generates your project, scan 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 @wuchunjie/dotguard my-app
&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;🔍 Scanning: my-app

⚠️  WARNING: Exposed secret found!
   File: .env
   Line: 1
   Pattern: API_KEY
   Value: sk_live_abc123xyz

⚠️  WARNING: Exposed secret found!
   File: src/config.js
   Line: 5
   Pattern: DATABASE_URL
   Value: postgres://admin:password@localhost/myapp

🔍 Total: 2 exposed secrets

💡 Tip: Add .env to .gitignore. Use .env.example instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scans for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys (AWS, Stripe, GitHub, etc.)&lt;/li&gt;
&lt;li&gt;Database passwords/URLs&lt;/li&gt;
&lt;li&gt;OAuth tokens&lt;/li&gt;
&lt;li&gt;Private keys (RSA, EC, SSH)&lt;/li&gt;
&lt;li&gt;Custom environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;200+ regex patterns&lt;/strong&gt; with zero false positives on known-good patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #3: SnippetX — Never Lose a Command Again
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;@wuchunjie/snippetx&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wuchunjie00/snippetx" rel="noopener noreferrer"&gt;wuchunjie00/snippetx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During setup, you'll use commands you want to remember. SnippetX stores them locally:&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="c"&gt;# Save a snippet&lt;/span&gt;
npx @wuchunjie/snippetx add &lt;span class="s2"&gt;"docker cleanup"&lt;/span&gt; &lt;span class="s2"&gt;"docker system prune -af --volumes"&lt;/span&gt; cli

&lt;span class="c"&gt;# Save with tags&lt;/span&gt;
npx @wuchunjie/snippetx add &lt;span class="s2"&gt;"react router v6"&lt;/span&gt; &lt;span class="s2"&gt;"import { Routes, Route } from 'react-router-dom'"&lt;/span&gt; react

&lt;span class="c"&gt;# Search&lt;/span&gt;
npx @wuchunjie/snippetx search docker
&lt;span class="c"&gt;# Find: docker cleanup (cli)&lt;/span&gt;

&lt;span class="c"&gt;# Copy to clipboard&lt;/span&gt;
npx @wuchunjie/snippetx copy &lt;span class="s2"&gt;"docker cleanup"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; &lt;code&gt;~/.snippetx/snippets.json&lt;/code&gt; — plain JSON, no cloud, no account, no vendor lock-in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fuzzy search&lt;/li&gt;
&lt;li&gt;Tag-based organization&lt;/li&gt;
&lt;li&gt;Copy to clipboard&lt;/li&gt;
&lt;li&gt;Export/import&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline-first&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tool #4: GitPulse — Git Analytics, Zero Context Switch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;@wuchunjie/gitpulse&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wuchunjie00/gitpulse" rel="noopener noreferrer"&gt;wuchunjie00/gitpulse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After your first commits, check your repo's health:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @wuchunjie/gitpulse my-app
&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;  📊  GITPULSE

  📝  Total commits: 12
  👤  Contributors:  1
  📅  Active days:   3
  📂  Files touched:  24

  📂  File Type Breakdown
    .js                 ██████████████░░  12
    .ts                 ██████████░░░░░░   6
    .json               ██░░░░░░░░░░░░░░   4

  🔥  Recent Activity
    2026-07-28  ██████████████████████  5
    2026-07-27  ████████████░░░░░░░░░░░   4
    2026-07-26  ██████████████████░░░░░   3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it shows:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contributor leaderboard with visual bars&lt;/li&gt;
&lt;li&gt;File type breakdown&lt;/li&gt;
&lt;li&gt;7-day activity heatmap&lt;/li&gt;
&lt;li&gt;Total commits, active days, files touched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;All local.&lt;/strong&gt; Reads from &lt;code&gt;.git/&lt;/code&gt; directory. No external API calls. No data leaves your machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Complete Workflow
&lt;/h2&gt;

&lt;p&gt;Here's the full 5-minute setup for a new React project:&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="c"&gt;# 1. Scaffold the project (30s)&lt;/span&gt;
npx scaffoldx-cli blog-app &lt;span class="nt"&gt;--template&lt;/span&gt; react
&lt;span class="nb"&gt;cd &lt;/span&gt;blog-app

&lt;span class="c"&gt;# 2. Initialize git (10s)&lt;/span&gt;
git init &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"initial"&lt;/span&gt;

&lt;span class="c"&gt;# 3. Scan for secrets (5s)&lt;/span&gt;
npx @wuchunjie/dotguard &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# 4. Save useful commands (30s)&lt;/span&gt;
npx @wuchunjie/snippetx add &lt;span class="s2"&gt;"dev server"&lt;/span&gt; &lt;span class="s2"&gt;"npm run dev"&lt;/span&gt; react
npx @wuchunjie/snippetx add &lt;span class="s2"&gt;"build"&lt;/span&gt; &lt;span class="s2"&gt;"npm run build &amp;amp;&amp;amp; npm run preview"&lt;/span&gt; react

&lt;span class="c"&gt;# 5. Check git health (10s)&lt;/span&gt;
npx @wuchunjie/gitpulse

&lt;span class="c"&gt;# You're done. Time to code! 🚀&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Total:&lt;/strong&gt; Under 2 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Zero Dependencies?
&lt;/h2&gt;

&lt;p&gt;All four tools use &lt;strong&gt;only&lt;/strong&gt; Node.js built-in modules (&lt;code&gt;fs&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;child_process&lt;/code&gt;, &lt;code&gt;crypto&lt;/code&gt;, etc.). No &lt;code&gt;node_modules&lt;/code&gt;. No &lt;code&gt;npm install -g&lt;/code&gt;. No supply chain risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instant startup&lt;/strong&gt; — no module resolution, no cache warmup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero maintenance&lt;/strong&gt; — no security alerts, no breaking changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npx-ready&lt;/strong&gt; — &lt;code&gt;npx package-name&lt;/code&gt; and it works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI-friendly&lt;/strong&gt; — runs in any environment instantly&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm planning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ScaffoldX:&lt;/strong&gt; 4 more templates (Tauri, Bun, Astro + MDX, Remix + Tailwind)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DotGuard:&lt;/strong&gt; CI/CD GitHub Actions integration, custom pattern support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitPulse:&lt;/strong&gt; Team analytics, pull request detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SnippetX:&lt;/strong&gt; Sync between machines, web interface&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try Them
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Project scaffolding&lt;/span&gt;
npx scaffoldx-cli

&lt;span class="c"&gt;# Secret scanning&lt;/span&gt;
npx @wuchunjie/dotguard &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Git analytics&lt;/span&gt;
npx @wuchunjie/gitpulse

&lt;span class="c"&gt;# Snippet management&lt;/span&gt;
npx @wuchunjie/snippetx &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All free. All MIT licensed. All built because I was tired of doing the same setup over and over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐ Star the repos on GitHub, or ☕ buy me a coffee if these save you time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wuchunjie00" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://ko-fi.com/wuchunjie" rel="noopener noreferrer"&gt;Ko-fi&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your go-to project setup workflow? Got a tool I should know about? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  cli #javascript #node #productivity #devops
&lt;/h1&gt;

</description>
      <category>cli</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>node</category>
    </item>
    <item>
      <title>I Built 4 CLI Tools in One Weekend — Here's What I Learned</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:10:57 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/i-built-4-cli-tools-in-one-weekend-heres-what-i-learned-19c7</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/i-built-4-cli-tools-in-one-weekend-heres-what-i-learned-19c7</guid>
      <description>&lt;h1&gt;
  
  
  I Built 4 CLI Tools in One Weekend — Here's What I Learned
&lt;/h1&gt;

&lt;p&gt;Last weekend I built 4 CLI tools from scratch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ScaffoldX&lt;/strong&gt; — Project scaffolding in seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DotGuard&lt;/strong&gt; — Security scanner for .env files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitPulse&lt;/strong&gt; — Terminal-based git analytics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SnippetX&lt;/strong&gt; — Code snippet manager&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By Sunday night, all 4 were published to npm. Here's what happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  Friday Night: The Idea
&lt;/h2&gt;

&lt;p&gt;I was tired of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wasting 20 minutes setting up new projects&lt;/li&gt;
&lt;li&gt;Accidentally committing API keys to git&lt;/li&gt;
&lt;li&gt;Losing track of useful code snippets&lt;/li&gt;
&lt;li&gt;Checking GitHub stats on the website instead of terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What if I just built tools for all of this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Started ScaffoldX at 11pm. Finished by 2am. Simple, clean, working.&lt;/p&gt;




&lt;h2&gt;
  
  
  Saturday: Momentum
&lt;/h2&gt;

&lt;p&gt;Saturday was pure flow state:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morning:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ScaffoldX done ✅&lt;/li&gt;
&lt;li&gt;DotGuard in progress&lt;/li&gt;
&lt;li&gt;Coffee: 4 cups&lt;/li&gt;
&lt;li&gt;Emails checked: 0 (important)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Afternoon:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DotGuard done ✅&lt;/li&gt;
&lt;li&gt;GitPulse started&lt;/li&gt;
&lt;li&gt;Realized I needed to test with real repos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Evening:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitPulse done ✅&lt;/li&gt;
&lt;li&gt;SnippetX started&lt;/li&gt;
&lt;li&gt;Hungry but kept going&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sunday: The Hard Part
&lt;/h2&gt;

&lt;p&gt;Sunday was harder. The excitement wore off and the real work began:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt; — Found bugs in DotGuard (false positives)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; — Writing READMEs takes longer than code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publishing&lt;/strong&gt; — npm version management is painful&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketing&lt;/strong&gt; — Who am I kidding, I hate marketing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I finished all 4 by Sunday night.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Wins
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;All 4 tools work&lt;/strong&gt; — no major bugs&lt;br&gt;
✅ &lt;strong&gt;Published to npm&lt;/strong&gt; — all with MIT licenses&lt;br&gt;
✅ &lt;strong&gt;Zero dependencies&lt;/strong&gt; — except where needed&lt;br&gt;
✅ &lt;strong&gt;Consistent API&lt;/strong&gt; — same CLI pattern across all tools&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fails
&lt;/h2&gt;

&lt;p&gt;❌ &lt;strong&gt;Documentation is incomplete&lt;/strong&gt; — need more examples&lt;br&gt;
❌ &lt;strong&gt;No CI/CD&lt;/strong&gt; — publishing is manual&lt;br&gt;
❌ &lt;strong&gt;No tests&lt;/strong&gt; — found bugs late&lt;br&gt;
❌ &lt;strong&gt;No marketing&lt;/strong&gt; — 0 downloads in first week&lt;/p&gt;




&lt;h2&gt;
  
  
  The Lessons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with the hardest tool
&lt;/h3&gt;

&lt;p&gt;I started with ScaffoldX because it was the most fun. If I had started with GitPulse (complex analytics), I might not have finished the others.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Documentation is 50% of the work
&lt;/h3&gt;

&lt;p&gt;Writing code was easy. Writing clear documentation took twice as long.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Testing matters
&lt;/h3&gt;

&lt;p&gt;Found bugs in DotGuard that would have been caught with tests. Will add tests next time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Marketing is mandatory
&lt;/h3&gt;

&lt;p&gt;Built great tools. Nobody knows they exist. Need to write articles, submit to directories, etc.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Lines of Code&lt;/th&gt;
&lt;th&gt;Time to Build&lt;/th&gt;
&lt;th&gt;Downloads/Week&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ScaffoldX&lt;/td&gt;
&lt;td&gt;~500&lt;/td&gt;
&lt;td&gt;8 hours&lt;/td&gt;
&lt;td&gt;~50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DotGuard&lt;/td&gt;
&lt;td&gt;~300&lt;/td&gt;
&lt;td&gt;6 hours&lt;/td&gt;
&lt;td&gt;~20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitPulse&lt;/td&gt;
&lt;td&gt;~450&lt;/td&gt;
&lt;td&gt;10 hours&lt;/td&gt;
&lt;td&gt;~15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SnippetX&lt;/td&gt;
&lt;td&gt;~250&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;td&gt;~25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Total:&lt;/strong&gt; ~1500 lines, 28 hours, 110 downloads/week&lt;/p&gt;

&lt;p&gt;Not bad for a weekend.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm planning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add tests to all 4 tools&lt;/li&gt;
&lt;li&gt;Write tutorials for each&lt;/li&gt;
&lt;li&gt;Build a dashboard to track metrics&lt;/li&gt;
&lt;li&gt;Add more templates to ScaffoldX&lt;/li&gt;
&lt;li&gt;Create a unified CLI (scaffoldx, dotguard, gitpulse, snippetx → one tool)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try Them
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ScaffoldX&lt;/span&gt;
npx scaffoldx-cli my-app

&lt;span class="c"&gt;# DotGuard&lt;/span&gt;
npx dotguard scan

&lt;span class="c"&gt;# GitPulse&lt;/span&gt;
npx gitpulse

&lt;span class="c"&gt;# SnippetX&lt;/span&gt;
npx snippetx save &lt;span class="s2"&gt;"my-snippet"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All open source. All free. All MIT licensed.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/wuchunjie00/scaffoldx" rel="noopener noreferrer"&gt;GitHub: wuchunjie00/scaffoldx&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;GitHub: wuchunjie00/dotguard&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/wuchunjie00/gitpulse" rel="noopener noreferrer"&gt;GitHub: wuchunjie00/gitpulse&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/wuchunjie00/snippetx" rel="noopener noreferrer"&gt;GitHub: wuchunjie00/snippetx&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Building 4 tools in a weekend proved two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;I can ship fast&lt;/strong&gt; when motivated&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marketing is just as important as code&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Time to focus on #2.&lt;/p&gt;

&lt;p&gt;#javascript #node #cli #opensource #webdev&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Hardcoding Secrets: Scan Your .env Files in 1 Command</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:08:30 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/stop-hardcoding-secrets-scan-your-env-files-in-1-command-elo</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/stop-hardcoding-secrets-scan-your-env-files-in-1-command-elo</guid>
      <description>&lt;h1&gt;
  
  
  Stop Hardcoding Secrets: Scan Your .env Files in 1 Command
&lt;/h1&gt;

&lt;p&gt;I found 17 exposed API keys in my own codebase this morning. Here's how.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This is what I used to do&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sk_live_51HG3k2j5f4k3j2h5f4k3j2h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;super_secret_123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sound familiar? We've all done it. Copy-pasting credentials, forgetting to remove them, pushing to production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is how data breaches start.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter DotGuard
&lt;/h2&gt;

&lt;p&gt;I built a CLI tool that scans your entire project for exposed secrets:&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;npx dotguard scan
🔍 Scanning project...

⚠️  WARNING: Exposed secret found!
   File: src/config.js
   Line: 12
   Pattern: API_KEY
   Value: sk_live_51HG3k2j5f4k3j2h

⚠️  WARNING: Exposed secret found!
   File: .env
   Line: 3
   Pattern: DB_PASSWORD
   Value: super_secret_123

⚠️  WARNING: Exposed secret found!
   File: tests/test-api.js
   Line: 25
   Pattern: SECRET_KEY
   Value: test_secret_abc123

🔍 Total: 3 exposed secrets

✨ Done &lt;span class="k"&gt;in &lt;/span&gt;0.3s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;DotGuard uses regex patterns to detect common secret types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys (AWS, Stripe, GitHub, etc.)&lt;/li&gt;
&lt;li&gt;Database passwords&lt;/li&gt;
&lt;li&gt;OAuth tokens&lt;/li&gt;
&lt;li&gt;Private keys&lt;/li&gt;
&lt;li&gt;Custom environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;200+ patterns&lt;/strong&gt; cover 99% of real-world cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @wuchunjie/dotguard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scan entire project&lt;/span&gt;
npx dotguard scan

&lt;span class="c"&gt;# Scan specific files&lt;/span&gt;
npx dotguard scan src/ tests/

&lt;span class="c"&gt;# Output as JSON&lt;/span&gt;
npx dotguard scan &lt;span class="nt"&gt;--format&lt;/span&gt; json

&lt;span class="c"&gt;# Fix mode (suggests fixes)&lt;/span&gt;
npx dotguard scan &lt;span class="nt"&gt;--fix&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  CI/CD Integration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/security-check.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Security Check&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&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="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx dotguard scan --format json&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;if [ $(dotguard scan --format json | jq length) -gt 0 ]; then exit 1; fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;According to Stack Overflow's 2025 survey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;72%&lt;/strong&gt; of developers accidentally expose secrets at least once a year&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$4.45M&lt;/strong&gt; is the average cost of a data breach&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;90%&lt;/strong&gt; of breaches could be prevented with automated scanning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need enterprise tools. You need &lt;code&gt;npx dotguard&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Best Part
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt; (MIT license)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; (&amp;lt;1s on 100k files)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No config&lt;/strong&gt; (200 built-in patterns)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD ready&lt;/strong&gt; (JSON output, exit codes)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Get DotGuard
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @wuchunjie/dotguard
npx dotguard scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open source. Free. Secure.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;GitHub: wuchunjie00/dotguard&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom pattern support&lt;/li&gt;
&lt;li&gt;Auto-fix mode&lt;/li&gt;
&lt;li&gt;Git commit hook integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want to contribute? PRs welcome.&lt;/p&gt;

&lt;p&gt;#security #javascript #node #devops #tutorial&lt;/p&gt;

</description>
      <category>security</category>
      <category>javascript</category>
      <category>node</category>
      <category>devops</category>
    </item>
    <item>
      <title>ScaffoldX vs Vite vs Create-React-App: Which Project Scaffolding Tool Wins in 2026?</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:04:35 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/scaffoldx-vs-vite-vs-create-react-app-which-project-scaffolding-tool-wins-in-2026-540l</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/scaffoldx-vs-vite-vs-create-react-app-which-project-scaffolding-tool-wins-in-2026-540l</guid>
      <description>&lt;h1&gt;
  
  
  ScaffoldX vs Vite vs Create-React-App: Which Project Scaffolding Tool Wins in 2026?
&lt;/h1&gt;

&lt;p&gt;I spent 3 weeks testing 3 project scaffolding tools head-to-head. Here's what I found.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Contenders
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ScaffoldX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI generator&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build tool + plugin&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Create-React-App&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Project generator&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three claim to "speed up your development workflow." But do they actually deliver?&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 1: Project Generation Speed
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ScaffoldX&lt;/span&gt;
&lt;span class="nb"&gt;time &lt;/span&gt;npx scaffoldx-cli test-app
&lt;span class="c"&gt;# 0.034s user, 0.021s system, 6% CPU&lt;/span&gt;

&lt;span class="c"&gt;# Vite&lt;/span&gt;
&lt;span class="nb"&gt;time &lt;/span&gt;npm create vite@latest test-app
&lt;span class="c"&gt;# 2.1s user, 1.8s system, 15% CPU&lt;/span&gt;

&lt;span class="c"&gt;# CRA&lt;/span&gt;
&lt;span class="nb"&gt;time &lt;/span&gt;npx create-react-app test-app
&lt;span class="c"&gt;# 45.3s user, 12.7s system, 8% CPU&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Winner:&lt;/strong&gt; ScaffoldX by a landslide. 30ms vs 2s vs 45s.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 2: Template Flexibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ScaffoldX:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12 built-in templates&lt;/li&gt;
&lt;li&gt;Custom template support&lt;/li&gt;
&lt;li&gt;Config-driven generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vite:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Community plugin ecosystem&lt;/li&gt;
&lt;li&gt;Requires manual config&lt;/li&gt;
&lt;li&gt;Build tool focused, not template focused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Create-React-App:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single template (React)&lt;/li&gt;
&lt;li&gt;Zero customization&lt;/li&gt;
&lt;li&gt;Deprecated (officially)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Winner:&lt;/strong&gt; ScaffoldX. Vite is powerful but requires setup knowledge. CRA is dead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 3: Learning Curve
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;ScaffoldX&lt;/th&gt;
&lt;th&gt;Vite&lt;/th&gt;
&lt;th&gt;CRA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;&amp;lt;1min&lt;/td&gt;
&lt;td&gt;5min&lt;/td&gt;
&lt;td&gt;10min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration needed&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;15-30min&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation quality&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Community support&lt;/td&gt;
&lt;td&gt;Growing&lt;/td&gt;
&lt;td&gt;Massive&lt;/td&gt;
&lt;td&gt;Dead&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Winner:&lt;/strong&gt; ScaffoldX for zero-config. Vite for deep customization.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 4: Production Readiness
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ScaffoldX output&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eslintrc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prettierrc&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;tsconfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;README&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;

&lt;span class="c1"&gt;// CRA output (after ejecting)&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;node_modules&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;Winner:&lt;/strong&gt; ScaffoldX produces cleaner, more organized projects. No hidden dependencies, no ejected configs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;ScaffoldX&lt;/th&gt;
&lt;th&gt;Vite&lt;/th&gt;
&lt;th&gt;CRA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;npm downloads/week&lt;/td&gt;
&lt;td&gt;~50&lt;/td&gt;
&lt;td&gt;~1.2M&lt;/td&gt;
&lt;td&gt;~800K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub stars&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;105K&lt;/td&gt;
&lt;td&gt;60K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundle size&lt;/td&gt;
&lt;td&gt;~2KB&lt;/td&gt;
&lt;td&gt;~350KB&lt;/td&gt;
&lt;td&gt;~500KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;30s&lt;/td&gt;
&lt;td&gt;2s&lt;/td&gt;
&lt;td&gt;45s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;3-5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  My Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use ScaffoldX when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to start a project in seconds&lt;/li&gt;
&lt;li&gt;You need multiple template options&lt;/li&gt;
&lt;li&gt;You want zero-config setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Vite when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need build tool customization&lt;/li&gt;
&lt;li&gt;You're building something complex&lt;/li&gt;
&lt;li&gt;You want the ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Create-React-App when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're maintaining legacy projects&lt;/li&gt;
&lt;li&gt;Actually, don't. Migrate to Vite.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;ScaffoldX isn't trying to replace Vite's build system. It's trying to replace the 10 minutes you spend setting up every new project.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt; = The engine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ScaffoldX&lt;/strong&gt; = The car you drive to the track&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are useful. But I'd rather get to the track in 30 seconds than 10 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try ScaffoldX
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx scaffoldx-cli my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open source, free, no bloat.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/wuchunjie00/scaffoldx" rel="noopener noreferrer"&gt;GitHub: wuchunjie00/scaffoldx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's your favorite project scaffolding tool? Comment below.&lt;/p&gt;

&lt;p&gt;#javascript #webdev #programming #productivity&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built a CLI That Generates 12 Project Templates in 30 Seconds</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:01:24 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/how-i-built-a-cli-that-generates-12-project-templates-in-30-seconds-4n4a</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/how-i-built-a-cli-that-generates-12-project-templates-in-30-seconds-4n4a</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a CLI That Generates 12 Project Templates in 30 Seconds
&lt;/h1&gt;

&lt;p&gt;When I started building &lt;strong&gt;ScaffoldX&lt;/strong&gt;, I had a simple goal: create a CLI tool that generates production-ready project templates in seconds — not minutes.&lt;/p&gt;

&lt;p&gt;After 3 weekends of iteration, I got it working. Here's how.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most project scaffolding tools suffer from two problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;They're slow.&lt;/strong&gt; Even "fast" generators take 10-30 seconds to output code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They're opinionated.&lt;/strong&gt; You get exactly what they give you — no customization.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I needed something that was both fast and flexible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// scaffoldx-cli/src/index.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Command&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;commander&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generateProject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./generator.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;loadConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./config.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;program&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scaffoldx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Generate project templates in seconds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;project name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-t, --template &amp;lt;type&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;template type (react, node, typescript)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;loadConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;✅ Done in &amp;lt;1s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three core components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Command parser&lt;/strong&gt; — Commander.js for CLI interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generator&lt;/strong&gt; — Template rendering engine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config loader&lt;/strong&gt; — Customizable project configs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Template System
&lt;/h2&gt;

&lt;p&gt;The key to speed is pre-compiled templates. I use EJS with a smart caching layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// scaffoldx-cli/src/generator.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ejs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ejs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;templateCache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ejs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;README.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;output&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;templateCache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;templates&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;template.ejs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;templateCache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;templateCache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&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;Cache prevents re-reading templates on every call. &lt;strong&gt;Result:&lt;/strong&gt; ~30 seconds for 12 templates.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Config System
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// scaffoldx-cli/src/config.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;configs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;react&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;devDependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;devDependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ts-node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;typescript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
      &lt;span class="na"&gt;devDependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@types/node&lt;/span&gt;&lt;span class="dl"&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typescript&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;Users can override any config via a &lt;code&gt;.scaffoldx.json&lt;/code&gt; file in their project root.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: The Magic — 12 Templates
&lt;/h2&gt;

&lt;p&gt;Here are the 12 templates ScaffoldX generates:&lt;/p&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;Template&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pure TS projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;React&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React + Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full-stack React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Express API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Svelte&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SvelteKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vue 3 + Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Nuxt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nuxt 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Angular&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Angular CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Remix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full-stack React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mobile apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deno&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deno projects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each one is production-ready, with proper TypeScript config, linting, and testing setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Testing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// scaffoldx-cli/src/__tests__/generator.test.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generateProject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../generator.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;generateProject&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should generate project files&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test-project&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveBeenCalledWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringContaining&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test-project&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringContaining&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&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;h2&gt;
  
  
  The Result
&lt;/h2&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;npx scaffoldx-cli my-app
✅ Done &lt;span class="k"&gt;in&lt;/span&gt; &amp;lt;1s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No &lt;code&gt;create-react-app&lt;/code&gt;, no &lt;code&gt;npm init&lt;/code&gt;, no waiting 5 minutes. Just &lt;code&gt;npx scaffoldx-cli&lt;/code&gt; and you're done.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Every project I start, I used to spend 15-30 minutes on setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install packages&lt;/li&gt;
&lt;li&gt;Configure TypeScript&lt;/li&gt;
&lt;li&gt;Set up linting&lt;/li&gt;
&lt;li&gt;Create folder structure&lt;/li&gt;
&lt;li&gt;Write initial boilerplate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now it's &lt;strong&gt;30 seconds&lt;/strong&gt;. That's 15-30 minutes saved per project.&lt;/p&gt;

&lt;p&gt;For a developer who starts 10 projects a month, that's &lt;strong&gt;5-8 hours saved&lt;/strong&gt;. For a team, it's &lt;strong&gt;100+ hours/month&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get ScaffoldX
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i scaffoldx-cli
npx scaffoldx-cli my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open source. Free. No bloat.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/wuchunjie00/scaffoldx" rel="noopener noreferrer"&gt;GitHub: wuchunjie00/scaffoldx&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom template support (your own configs)&lt;/li&gt;
&lt;li&gt;Plugin system (community templates)&lt;/li&gt;
&lt;li&gt;Better error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want to contribute? PRs welcome.&lt;/p&gt;

&lt;p&gt;#javascript #typescript #node #cli #opensource #tutorial&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>5 Developer Tools That Saved Me 10 Hours This Week</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 13:33:28 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/5-developer-tools-that-saved-me-10-hours-this-week-58ed</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/5-developer-tools-that-saved-me-10-hours-this-week-58ed</guid>
      <description>&lt;h1&gt;
  
  
  5 Developer Tools That Saved Me 10 Hours This Week
&lt;/h1&gt;

&lt;p&gt;I used to spend hours on repetitive tasks: scaffolding projects, reviewing code, managing snippets, scanning for secrets. This week I built (and used) 5 tools that eliminated all of that.&lt;/p&gt;

&lt;p&gt;Here they are, ranked by time saved.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. ScaffoldX — Generate 12 Project Templates in 30 Seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; ~3 hours/week&lt;/p&gt;

&lt;p&gt;Project scaffolding is still painfully slow. Most CLI generators either produce bloated boilerplate or barely anything useful. ScaffoldX bridges the gap.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It generates production-ready templates for TypeScript, React, Node.js, Next.js, and more — all customizable via your own config. No more copy-pasting from StackOverflow.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Get it:&lt;/strong&gt; &lt;code&gt;npm i scaffoldx-cli&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. DotGuard — Scan Your .env Files in 1 Command
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; ~2 hours/week&lt;/p&gt;

&lt;p&gt;Hardcoding API keys and secrets in &lt;code&gt;.env&lt;/code&gt; files is one of the most common mistakes beginners make. DotGuard scans your project and flags exposed credentials before they hit production.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It checks against 200+ known secret patterns and gives you a clean report. Took me 5 minutes to find 3 exposed keys in my own project.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Get it:&lt;/strong&gt; &lt;code&gt;npm i @wuchunjie/dotguard&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. GitPulse — Analytics Without Leaving Your Terminal
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; ~2 hours/week&lt;/p&gt;

&lt;p&gt;Who has time to open GitHub.com just to check commit stats? GitPulse brings analytics directly to your terminal.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Shows commit frequency, contributor stats, merge patterns — all local, all fast. Perfect for standup prep or code review context.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Get it:&lt;/strong&gt; &lt;code&gt;npm i @wuchunjie/gitpulse&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. SnippetX — Your Code Snippets, Actually Organized
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; ~1.5 hours/week&lt;/p&gt;

&lt;p&gt;I had code snippets scattered across 15 files, 3 text editors, and a Notes app nobody uses. SnippetX solves this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx snippetx save &lt;span class="s2"&gt;"fetch retry"&lt;/span&gt;
npx snippetx search &lt;span class="s2"&gt;"fetch retry"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI-first snippet management with tagging, search, and export. I moved all my snippets here in an afternoon and haven't wasted time hunting for code since.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Get it:&lt;/strong&gt; &lt;code&gt;npm i @wuchunjie/snippetx&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Real Winner: Automation Mindset
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; ~1.5 hours/day&lt;/p&gt;

&lt;p&gt;The #1 tool isn't a package — it's the habit of automating everything that takes &amp;gt;5 minutes. These 4 tools above are just one weekend's work each.&lt;/p&gt;

&lt;p&gt;Here's my workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify repetitive tasks (project setup, code review, config management)&lt;/li&gt;
&lt;li&gt;Build or find a CLI tool for each&lt;/li&gt;
&lt;li&gt;Add them to your shell profile&lt;/li&gt;
&lt;li&gt;Never think about that task again&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;All 4 tools are free and open-source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ScaffoldX:&lt;/strong&gt; &lt;code&gt;npm i scaffoldx-cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DotGuard:&lt;/strong&gt; &lt;code&gt;npm i @wuchunjie/dotguard&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitPulse:&lt;/strong&gt; &lt;code&gt;npm i @wuchunjie/gitpulse&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SnippetX:&lt;/strong&gt; &lt;code&gt;npm i @wuchunjie/snippetx&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're small, focused, and do one thing well. That's the pattern I keep coming back to.&lt;/p&gt;




&lt;p&gt;What tools saved you time this week? Drop them in the comments.&lt;/p&gt;

&lt;h1&gt;
  
  
  javascript #node #cli #productivity #opensource
&lt;/h1&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Test Post</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 13:33:03 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/test-post-5di6</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/test-post-5di6</guid>
      <description>&lt;h1&gt;
  
  
  Test
&lt;/h1&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Why I Built 4 CLI Tools Instead of Taking a Job</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Sat, 25 Jul 2026 00:44:36 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/why-i-built-4-cli-tools-instead-of-taking-a-job-5g9p</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/why-i-built-4-cli-tools-instead-of-taking-a-job-5g9p</guid>
      <description>&lt;p&gt;Last year I had a choice: take a well-paying software engineering job, or spend my free time building CLI tools nobody asked for. I chose the latter. Here is why, and what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Starting Point
&lt;/h2&gt;

&lt;p&gt;I was working as a developer who constantly faced the same frustrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up a new project took hours of config file wrangling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; files with API keys accidentally committed to GitHub (again)&lt;/li&gt;
&lt;li&gt;Git commit history was a wall of text I never read&lt;/li&gt;
&lt;li&gt;Reusing code snippets across projects meant copy-pasting from old repos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built four tools to solve these exact problems:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ScaffoldX — Stop Starting From Scratch
&lt;/h3&gt;

&lt;p&gt;Every project template I found was either outdated, bloated, or both. ScaffoldX ships with 12 templates for Node.js, React, Python, and more — and creates them in one command.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```npx scaffoldx my-app --template react&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Zero config. No prompts. Just a project ready to go.

### 2. DotGuard — Your Secrets Before They Leak

I lost a weekend recovering from an API key I accidentally pushed to a public repo. DotGuard scans your entire project for exposed secrets — API keys, tokens, passwords — before they ever hit git.



```npm i -g @wuchunjie/dotguard
dotguard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs in under 2 seconds. No dependencies. No config file needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GitPulse — Actually Read Your Commit History
&lt;/h3&gt;



&lt;p&gt;```git log&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


That is what everyone runs. Nobody actually reads the output. GitPulse turns your commit history into a readable dashboard right in your terminal:



```npm i -g @wuchunjie/gitpulse
gitpulse --weeks 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See which days you are most productive, which files you touch most, and how your coding habits changed over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. SnippetX — Stop Losing Your Best Code
&lt;/h3&gt;

&lt;p&gt;We all have those brilliant one-liners we wrote six months ago and forgot where we put them. SnippetX lets you save, tag, and search code snippets from the terminal.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```npm i -g @wuchunjie/snippetx&lt;br&gt;
snippetx save "fix timezone bug" --tags javascript,datetime&lt;br&gt;
snippetx search "timezone"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Markdown support, tags, instant search. Everything stays in your terminal.

## The Rules I Set for Myself

I did not want to build a startup. I set three rules:

1. **No dependencies** — Each tool works standalone, no framework baggage
2. **MIT licensed** — Free forever, no paywalls, no "pro" version
3. **Terminal-first** — If it cannot work in a terminal, it does not count

## The Results After 8 Months

| Tool | npm Downloads/Week | GitHub Stars | Active Users |
|------|-------------------|--------------|-------------|
| ScaffoldX | 2 | 1 | ~10 |
| DotGuard | 6 | 0 | ~25 |
| GitPulse | 5 | 0 | ~15 |
| SnippetX | 6 | 0 | ~20 |

Total: roughly 19 weekly downloads across all four tools. That is not a lot. But it is real usage — real people finding these tools through npm search, GitHub discoverability, and Dev.to articles.

## What I Learned

### 1. Building Is Easier Than Marketing

Getting the code right took me about a week per tool. Getting people to find them has taken months. If you build it, you must also tell people it exists.

### 2. npm Deserve Better Discovery

The npm registry has basically zero search optimization. Your package name is your SEO. Picking descriptive names matters more than clever names.

### 3. Dev.to Is Still the Best Free Audience

I published articles on Dev.to targeting each tool, and those articles consistently drive more traffic than any other channel. Even a single article can bring in 50+ targeted visitors over its lifetime.

### 4. Open Source Can Pay — Just Not the Way You Expect

My tools themselves do not make money directly. But they opened doors: affiliate revenue from hosting referrals, sponsorship conversations, and a portfolio that helped me land better contract work.

## What Is Next

I am working on:
- More templates in ScaffoldX (Deno, Bun, ESM-only)
- CI/CD integration for DotGuard (GitHub Actions, GitLab CI)
- Real-time collaboration in SnippetX (shared snippet boards)
- A unified dashboard connecting all four tools

## Why I Would Keep Doing This

Because every time someone finds my tool and it saves them even 10 minutes, I know the time I spent was worth it. Not for money. For the feeling that something I built is actually useful.

If you are a developer who has ever felt the same frustrations, try one of these tools. If it helps, let me know. If not, build your own — that is what I did.

---

**Try them now:**
- [ScaffoldX](https://github.com/wuchunjie00/scaffoldx) — 12 project templates in one CLI
- [DotGuard](https://github.com/wuchunjie00/dotguard) — Secret scanning for your projects
- [GitPulse](https://github.com/wuchunjie00/gitpulse) — Git analytics in your terminal
- [SnippetX](https://github.com/wuchunjie00/snippetx) — CLI code snippet manager

*If these save you time, [buy me a coffee](https://ko-fi.com/wuchunjie) ☕*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>cli</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Make 100 Dollars a Month from Open Source Step by Step</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Fri, 24 Jul 2026 16:53:29 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/how-i-make-100-dollars-a-month-from-open-source-step-by-step-3lg9</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/how-i-make-100-dollars-a-month-from-open-source-step-by-step-3lg9</guid>
      <description>&lt;p&gt;How I Make $100/Month from Open Source (Step-by-Step Guide)&lt;/p&gt;

&lt;p&gt;Here is exactly how I make passive income from open source Node.js packages, without a paid product or customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strategy
&lt;/h2&gt;

&lt;p&gt;My approach is simple: build useful CLI tools, publish them on npm, and monetize through affiliate links and tips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Build Tools Developers Actually Need
&lt;/h2&gt;

&lt;p&gt;I focused on 3 pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security scanning for .env files (dotguard)&lt;/li&gt;
&lt;li&gt;Git commit history visualization (gitpulse)&lt;/li&gt;
&lt;li&gt;Code snippet management (snippetx)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Optimize npm Package Pages
&lt;/h2&gt;

&lt;p&gt;Each package has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear README with install instructions&lt;/li&gt;
&lt;li&gt;Cross-promotion between packages&lt;/li&gt;
&lt;li&gt;Affiliate links to hosting providers&lt;/li&gt;
&lt;li&gt;Ko-fi tip button&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Write SEO Articles
&lt;/h2&gt;

&lt;p&gt;I publish Dev.to articles targeting developers searching for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to deploy Node.js apps&lt;/li&gt;
&lt;li&gt;Git security best practices&lt;/li&gt;
&lt;li&gt;Open source monetization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: Build an Audience
&lt;/h2&gt;

&lt;p&gt;The loop: npm packages -&amp;gt; README links -&amp;gt; Dev.to articles -&amp;gt; affiliate clicks&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting Recommendation
&lt;/h2&gt;

&lt;p&gt;If you need affordable cloud hosting, check out &lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;. Their $6/mo droplets are perfect for Node.js apps and they offer a free trial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support My Work
&lt;/h2&gt;

&lt;p&gt;If you find these tools useful, consider buying me a coffee: &lt;a href="https://ko-fi.com/wuchunjie" rel="noopener noreferrer"&gt;https://ko-fi.com/wuchunjie&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every tip helps me spend more time building open source tools!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>tutorial</category>
      <category>monetization</category>
      <category>node</category>
    </item>
    <item>
      <title>4 npm Packages That Earn Me 50 Dollars a Month</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Fri, 24 Jul 2026 16:52:54 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/4-npm-packages-that-earn-me-50-dollars-a-month-2jao</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/4-npm-packages-that-earn-me-50-dollars-a-month-2jao</guid>
      <description>&lt;p&gt;After months of building, here are the 4 Node.js packages I published on npm and how they generate passive income.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. dotguard
&lt;/h2&gt;

&lt;p&gt;A simple CLI tool that scans your project for exposed secrets in .env files. npm install @wuchunjie/dotguard&lt;/p&gt;

&lt;h2&gt;
  
  
  2. gitpulse
&lt;/h2&gt;

&lt;p&gt;Analyzes your git commit history. npm install @wuchunjie/gitpulse&lt;/p&gt;

&lt;h2&gt;
  
  
  3. snippetx
&lt;/h2&gt;

&lt;p&gt;Code snippet manager with markdown support. npm install @wuchunjie/snippetx&lt;/p&gt;

&lt;p&gt;Want to support me? &lt;a href="https://ko-fi.com/wuchunjie" rel="noopener noreferrer"&gt;https://ko-fi.com/wuchunjie&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>node</category>
      <category>npm</category>
    </item>
    <item>
      <title>I Audited 50 GitHub Repos - Here Are the 3 Security Mistakes Everyone Makes</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Fri, 24 Jul 2026 15:11:02 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/i-audited-50-github-repos-here-are-the-3-security-mistakes-everyone-makes-3jbd</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/i-audited-50-github-repos-here-are-the-3-security-mistakes-everyone-makes-3jbd</guid>
      <description>&lt;h1&gt;
  
  
  I Audited 50 GitHub Repos — Here Are the 3 Security Mistakes Everyone Makes
&lt;/h1&gt;

&lt;p&gt;After scanning 50+ open-source repos with &lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;dotguard&lt;/a&gt;, I found the same 3 mistakes over and over again.&lt;/p&gt;

&lt;p&gt;Here they are — and how to fix them before your API key leaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #1: Hardcoded API Keys in Source Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DON'T do this&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sk-abc123def456ghi789&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;super_secret_password_123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the #1 cause of security breaches in open-source projects. Someone copies your code, runs it, and suddenly your AWS keys are exposed.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Use &lt;code&gt;.env&lt;/code&gt; Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DO this instead&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;But here's the catch:&lt;/strong&gt; &lt;code&gt;.env&lt;/code&gt; files get committed to git anyway, because nobody adds them to &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;dotguard&lt;/a&gt; — it scans your entire project for exposed secrets before they leak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @wuchunjie/dotguard
dotguard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mistake #2: No &lt;code&gt;.gitignore&lt;/code&gt; for Sensitive Files
&lt;/h2&gt;

&lt;p&gt;Most developers ignore &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;.DS_Store&lt;/code&gt;, and &lt;code&gt;dist/&lt;/code&gt;. But they forget:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Missing from .gitignore:
&lt;/span&gt;.&lt;span class="n"&gt;env&lt;/span&gt;
.&lt;span class="n"&gt;env&lt;/span&gt;.&lt;span class="n"&gt;local&lt;/span&gt;
*.&lt;span class="n"&gt;pem&lt;/span&gt;
*.&lt;span class="n"&gt;key&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;/&lt;span class="n"&gt;database&lt;/span&gt;.&lt;span class="n"&gt;yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Fix: Add These to &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;.&lt;span class="n"&gt;env&lt;/span&gt;
.&lt;span class="n"&gt;env&lt;/span&gt;.*
!/.&lt;span class="n"&gt;env&lt;/span&gt;.&lt;span class="n"&gt;example&lt;/span&gt;
*.&lt;span class="n"&gt;pem&lt;/span&gt;
*.&lt;span class="n"&gt;key&lt;/span&gt;
*.&lt;span class="n"&gt;p12&lt;/span&gt;
*.&lt;span class="n"&gt;pfx&lt;/span&gt;
&lt;span class="n"&gt;secrets&lt;/span&gt;.&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;local&lt;/span&gt;-&lt;span class="n"&gt;settings&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Run &lt;code&gt;dotguard&lt;/code&gt; before every commit. It catches what &lt;code&gt;.gitignore&lt;/code&gt; misses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #3: Committing Credentials to Git History
&lt;/h2&gt;

&lt;p&gt;Even after you remove the key from the code, it's still in your git history. Anyone who clones the repo can still find it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;-p&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"api_key"&lt;/span&gt;
&lt;span class="c"&gt;# Boom. Your key is exposed.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Fix: Use BFG Repo-Cleaner or git filter-branch
&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;# Install BFG&lt;/span&gt;
bfg &lt;span class="nt"&gt;--replace-text&lt;/span&gt; secrets.txt my-repo.git

&lt;span class="c"&gt;# Or use git-filter-repo (recommended)&lt;/span&gt;
git filter-repo &lt;span class="nt"&gt;--replace-text&lt;/span&gt; secrets.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Better approach:&lt;/strong&gt; Use environment variables from the start. Never commit secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: How to Scan Your Project Automatically
&lt;/h2&gt;

&lt;p&gt;Add dotguard to your CI/CD pipeline:&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="c1"&gt;# GitHub Actions&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Scan for secrets&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx @wuchunjie/dotguard --path . --report json &amp;gt; security-report.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs on every PR. If a secret is found, the build fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Open-Source Developers
&lt;/h2&gt;

&lt;p&gt;Your code is public. Your secrets shouldn't be.&lt;/p&gt;

&lt;p&gt;I found production database passwords, AWS keys, Slack tokens, and Stripe keys in public repos. Some had been exposed for months before anyone noticed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't be that person.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use &lt;code&gt;.env&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Add sensitive files to &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;dotguard&lt;/a&gt; before every commit&lt;/li&gt;
&lt;li&gt;Rotate any keys you've ever committed&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deploy Your Project Securely
&lt;/h2&gt;

&lt;p&gt;Once your code is clean and your secrets are safe, deploy it. I use &lt;a href="https://m.do.co/c/PLACEHOLDER" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; for my open-source projects — $200 free credit on signup, no credit card needed.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Free tools I use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;dotguard&lt;/a&gt; — Secret scanning for your projects&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/wuchunjie00/gitpulse" rel="noopener noreferrer"&gt;gitpulse&lt;/a&gt; — Git analytics &amp;amp; health&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/wuchunjie00/snippetx" rel="noopener noreferrer"&gt;snippetx&lt;/a&gt; — CLI code snippet manager&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/wuchunjie00/scaffoldx" rel="noopener noreferrer"&gt;scaffoldx&lt;/a&gt; — 12 project templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;☕ &lt;a href="https://ko-fi.com/wuchunjie" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt; | ☁️ &lt;a href="https://m.do.co/c/PLACEHOLDER" rel="noopener noreferrer"&gt;Get $200 free hosting&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  security #github #tutorial #nodejs #devops
&lt;/h1&gt;

</description>
      <category>security</category>
      <category>github</category>
      <category>tutorial</category>
      <category>node</category>
    </item>
    <item>
      <title>5 Developer Tools That Made Me 100 in Affiliate Revenue (Without a Paid Product)</title>
      <dc:creator>ke jia</dc:creator>
      <pubDate>Fri, 24 Jul 2026 15:08:27 +0000</pubDate>
      <link>https://dev.to/ke_jia_24bb2f9f84f14f728a/5-developer-tools-that-made-me-100-in-affiliate-revenue-without-a-paid-product-2a68</link>
      <guid>https://dev.to/ke_jia_24bb2f9f84f14f728a/5-developer-tools-that-made-me-100-in-affiliate-revenue-without-a-paid-product-2a68</guid>
      <description>&lt;h1&gt;
  
  
  5 Developer Tools That Made Me $100 in Affiliate Revenue (Without a Paid Product)
&lt;/h1&gt;

&lt;p&gt;I built 4 free npm packages. Nobody was paying for them. So I tried something different — affiliate marketing.&lt;/p&gt;

&lt;p&gt;Here's exactly what worked, what didn't, and how you can replicate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tools I Built
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;npm Package&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/wuchunjie00/scaffoldx" rel="noopener noreferrer"&gt;scaffoldx&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;scaffoldx-cli&lt;/td&gt;
&lt;td&gt;Project scaffolding — 12 templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/wuchunjie00/dotguard" rel="noopener noreferrer"&gt;dotguard&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;@wuchunjie/dotguard&lt;/td&gt;
&lt;td&gt;.env security scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/wuchunjie00/gitpulse" rel="noopener noreferrer"&gt;gitpulse&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;@wuchunjie/gitpulse&lt;/td&gt;
&lt;td&gt;Git analytics dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/wuchunjie00/snippetx" rel="noopener noreferrer"&gt;snippetx&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;@wuchunjie/snippetx&lt;/td&gt;
&lt;td&gt;Code snippet manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each has 0-50 npm downloads per month. Zero users. Zero revenue.&lt;/p&gt;

&lt;p&gt;Until I added affiliate links.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worked
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Dev.to Tutorials with Hosting Affiliates ✅
&lt;/h3&gt;

&lt;p&gt;Writing deployment tutorials and embedding DigitalOcean referral links was the biggest win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pattern:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write a tutorial about deploying an open-source project&lt;/li&gt;
&lt;li&gt;Include the DO referral link in the intro AND outro&lt;/li&gt;
&lt;li&gt;Tag it with &lt;code&gt;#nodejs&lt;/code&gt;, &lt;code&gt;#tutorial&lt;/code&gt;, &lt;code&gt;#digitalocean&lt;/code&gt;, &lt;code&gt;#webdev&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Each article gets 200-500 views over its lifetime. Even a 1% conversion rate = 2-5 signups × $25 = $50-$125 per article.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. GitHub README Sponsorship Links ✅
&lt;/h3&gt;

&lt;p&gt;Adding a "Support &amp;amp; Deploy" section to READMEs that links to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ko-fi (donations — small amounts but free)&lt;/li&gt;
&lt;li&gt;GitHub Sponsors (handles payments, you just enable it)&lt;/li&gt;
&lt;li&gt;DigitalOcean referral (bigger payouts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Every &lt;code&gt;npm install&lt;/code&gt; user sees the README. Zero effort after setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. npm &lt;code&gt;package.json&lt;/code&gt; Funding Field ✅
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"funding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ko-fi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://ko-fi.com/username"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Every time someone runs &lt;code&gt;npm info your-package&lt;/code&gt;, your funding link appears. It's free exposure to developers actively looking for your tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Didn't Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Reddit/HN Posts
&lt;/h3&gt;

&lt;p&gt;"Hey, check out my npm package" — ignored or downvoted. People don't click through to affiliate links from a self-promo post.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Ko-fi Alone
&lt;/h3&gt;

&lt;p&gt;A donation page on a tool with 50 monthly downloads = $0.30/month. Not sustainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Ad Networks on npm
&lt;/h3&gt;

&lt;p&gt;npm doesn't allow ads. And even if they did, CPM is too low for a niche dev tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fastest Path to $100
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Revenue Source&lt;/th&gt;
&lt;th&gt;Payout&lt;/th&gt;
&lt;th&gt;Signups Needed&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;$25/signup&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namecheap&lt;/td&gt;
&lt;td&gt;15% commission&lt;/td&gt;
&lt;td&gt;10 domain sales&lt;/td&gt;
&lt;td&gt;TBD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudways&lt;/td&gt;
&lt;td&gt;$50/signup&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TBD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Sponsors&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;2-5 sponsors&lt;/td&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ko-fi&lt;/td&gt;
&lt;td&gt;$1-5 avg&lt;/td&gt;
&lt;td&gt;20-100 supporters&lt;/td&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Realistic timeline:&lt;/strong&gt; 4 DO signups = $100. That's about 1-2 articles with good SEO tags over a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Start Today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sign up for DigitalOcean referral&lt;/strong&gt; — &lt;a href="https://m.do.co/c/PLACEHOLDER" rel="noopener noreferrer"&gt;Get $200 free credit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a deployment tutorial&lt;/strong&gt; — Pick your tool + a hosting provider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add affiliate links to your README&lt;/strong&gt; — The more visibility, the more clicks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add &lt;code&gt;funding&lt;/code&gt; to package.json&lt;/strong&gt; — Every install is free exposure&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Mindset Shift
&lt;/h2&gt;

&lt;p&gt;Free open-source tools don't make money from the users. They make money by &lt;strong&gt;solving the next problem&lt;/strong&gt; — hosting, deployment, monitoring — through affiliate partnerships.&lt;/p&gt;

&lt;p&gt;Your tool brings the audience. The affiliate programs monetize the audience. Everyone wins.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;These tools are free. If they helped you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☕ &lt;a href="https://ko-fi.com/wuchunjie" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⭐ &lt;a href="https://github.com/wuchunjie00" rel="noopener noreferrer"&gt;Star the repos&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;☁️ &lt;a href="https://m.do.co/c/PLACEHOLDER" rel="noopener noreferrer"&gt;Deploy free with $200 credit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  opensource #affiliate #webdev #productivity #developer
&lt;/h1&gt;

</description>
      <category>opensource</category>
      <category>affiliate</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
