<?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: Mike Chen</title>
    <description>The latest articles on DEV Community by Mike Chen (@fengloulai).</description>
    <link>https://dev.to/fengloulai</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%2F3954647%2Faea4afce-da15-4fc2-a255-1c02f2eb22fb.png</url>
      <title>DEV Community: Mike Chen</title>
      <link>https://dev.to/fengloulai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fengloulai"/>
    <language>en</language>
    <item>
      <title>How I Built a Zero-Server Image Editor for 0¥/Month</title>
      <dc:creator>Mike Chen</dc:creator>
      <pubDate>Mon, 29 Jun 2026 15:02:21 +0000</pubDate>
      <link>https://dev.to/fengloulai/how-i-built-a-zero-server-image-editor-for-0ymonth-3fi0</link>
      <guid>https://dev.to/fengloulai/how-i-built-a-zero-server-image-editor-for-0ymonth-3fi0</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a Zero-Server Image Editor for 0¥/Month
&lt;/h1&gt;

&lt;p&gt;I needed a simple tool to make stickers for WeChat. Existing online editors either upload your images to their servers (privacy nightmare), require registration, or watermark your output.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://liangtu.cc" rel="noopener noreferrer"&gt;靓图 (LiangTu)&lt;/a&gt; — a pure client-side image editor that runs entirely in the browser. No server, no uploads, no account. Just drag, edit, download.&lt;/p&gt;

&lt;p&gt;Here's the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack: Zero Dependencies on the Server
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser (100% of logic)
├── Canvas API       — rendering pipeline
├── gif.js           — GIF encoding (Web Workers)
├── FileReader API   — local image loading
└── No backend. None.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The entire app is a static HTML/CSS/JS page served by Nginx. No Node.js, no database, no API routes. The server's job is to ship bytes once and shut up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;Three tools, one domain:&lt;/p&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;What it does&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sticker Editor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add text layers, filters, watermarks, crop, compress&lt;/td&gt;
&lt;td&gt;Canvas 2D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GIF Maker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Drag multiple images → reorder → adjust speed → export animated GIF&lt;/td&gt;
&lt;td&gt;gif.js + Web Workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Compressor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quality slider with live preview&lt;/td&gt;
&lt;td&gt;Canvas toDataURL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The sticker editor has 8 tools (crop, text with 14 Chinese fonts, background fill, flip, filters, adjustments, watermark, compress) plus a full layer system with z-ordering, rotation, and drag-to-reposition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Layer System
&lt;/h2&gt;

&lt;p&gt;This was the hardest part. Each text element is an independent layer with:&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="nx"&gt;layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;你好&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;canvasW&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;canvasH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fontFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Microsoft YaHei&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;textColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFFFFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;strokeColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#000000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;strokeWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The render loop draws background → layers (top to bottom) → watermark. Hit testing for drag uses &lt;code&gt;ctx.measureText()&lt;/code&gt; and rotation-aware bounding boxes. Selection shows a dashed outline with rotation handles.&lt;/p&gt;

&lt;h2&gt;
  
  
  GIF Encoding in the Browser
&lt;/h2&gt;

&lt;p&gt;For the GIF maker, I use &lt;a href="https://github.com/jnordberg/gif.js" rel="noopener noreferrer"&gt;gif.js&lt;/a&gt; — a pure JavaScript GIF encoder that runs in Web Workers. Users drag in multiple images, reorder them, set the delay per frame, and hit export.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gif&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;GIF&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;workers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;maxHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;workerScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gif.worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;gif&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;speeds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;gif&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;finished&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;blob&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// show preview + auto-download&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;gif&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The trick is normalizing all frames to the same dimensions (largest width × largest height), centering smaller images on a white background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "100% Local" Matters
&lt;/h2&gt;

&lt;p&gt;Every image stays in the browser. The &lt;code&gt;&amp;lt;input type="file"&amp;gt;&lt;/code&gt; loads directly into a &lt;code&gt;FileReader&lt;/code&gt;, then to an &lt;code&gt;Image&lt;/code&gt; object, then to Canvas. The download is &lt;code&gt;canvas.toBlob()&lt;/code&gt;. At no point does any pixel leave the user's machine.&lt;/p&gt;

&lt;p&gt;For Chinese users especially, uploading photos to unknown servers is a hard no. Making "no upload" the core feature was the right call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost: ~16¥/Month
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domain&lt;/strong&gt;: liangtu.cc — 29¥/year&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: Tencent Cloud Lighthouse (2 vCPU, 2GB RAM, 4Mbps) — 192¥/year&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total&lt;/strong&gt;: ~16¥/month (~$2.20 USD)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No serverless functions, no CDN tiers, no database. A single Nginx server serving static files. The 4Mbps bandwidth handles ~3,000 page views/month with plenty of headroom.&lt;/p&gt;

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

&lt;p&gt;Here's where I'm honest: I built the product. The SEO is decent. But nobody's finding it (~5 real visitors/day).&lt;/p&gt;

&lt;p&gt;If you've successfully grown a free tool site from zero, I'd love to hear how. Drop a comment or find me at &lt;a href="https://github.com/fengloulai/liangtu" rel="noopener noreferrer"&gt;github.com/fengloulai/liangtu&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;: &lt;a href="https://liangtu.cc" rel="noopener noreferrer"&gt;liangtu.cc&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/fengloulai/liangtu" rel="noopener noreferrer"&gt;github.com/fengloulai/liangtu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>showdev</category>
    </item>
    <item>
      <title>fd vs find vs ripgrep: I Created 10,000 Files to Settle This Debate</title>
      <dc:creator>Mike Chen</dc:creator>
      <pubDate>Fri, 29 May 2026 18:47:08 +0000</pubDate>
      <link>https://dev.to/fengloulai/fd-vs-find-vs-ripgrep-i-created-10000-files-to-settle-this-debate-1ik4</link>
      <guid>https://dev.to/fengloulai/fd-vs-find-vs-ripgrep-i-created-10000-files-to-settle-this-debate-1ik4</guid>
      <description>&lt;h1&gt;
  
  
  fd vs find vs ripgrep: I Created 10,000 Files to Settle This Debate
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;fd&lt;/code&gt; is ~2.5x faster than &lt;code&gt;find&lt;/code&gt; for filename searches, &lt;code&gt;rg&lt;/code&gt; demolishes &lt;code&gt;grep&lt;/code&gt; by ~3x for content searches, and &lt;code&gt;find&lt;/code&gt; + &lt;code&gt;grep&lt;/code&gt; combined lose on every single benchmark I ran. But there's a catch: both &lt;code&gt;fd&lt;/code&gt; and &lt;code&gt;rg&lt;/code&gt; skip hidden files by default, which can bite you if you're not paying attention. Here are the receipts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Did This
&lt;/h2&gt;

&lt;p&gt;Every time someone posts a shell one-liner using &lt;code&gt;find&lt;/code&gt; on Reddit, there's always that guy in the comments: &lt;em&gt;"jUsT uSe fD, iT's fAsTeR."&lt;/em&gt; Then someone else chimes in with &lt;em&gt;"actually ripgrep can do that too."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I got tired of the anecdotes. I wanted numbers. Real ones. On real files. So I fired up WSL, generated 10,900 files across 1,506 directories (~143 MB of mixed content), and ran actual benchmarks with &lt;code&gt;hyperfine&lt;/code&gt;. No synthetic microbenchmarks, no "I feel like X is faster" — just cold, hard terminal output.&lt;/p&gt;




&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Test Bed
&lt;/h3&gt;

&lt;p&gt;I created a directory at &lt;code&gt;/tmp/fd-benchmark&lt;/code&gt; containing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Plain text files&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;file_*.txt&lt;/code&gt; — 20 bytes each, contains "test content line N"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binary files&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;data_*.bin&lt;/code&gt; — 15 bytes each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log files&lt;/td&gt;
&lt;td&gt;1,500&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;match_*.log&lt;/code&gt; — contains unique "match_this_test_N" strings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config files&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nested_file_*.cfg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested dir files&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;level1_*/level2/level3/deep_*.txt&lt;/code&gt; + &lt;code&gt;level1_*/shallow_*.txt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden root files&lt;/td&gt;
&lt;td&gt;1,500&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.hidden_*&lt;/code&gt; + &lt;code&gt;.config_*.yml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden dir files&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.hidden_dir/subdir/deep_hidden_*.txt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git objects&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.git/objects/obj_*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-ext source files&lt;/td&gt;
&lt;td&gt;800&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;src_*.{py,js,ts,rs,go,java,rb,php,cpp,h,css,html,json,xml,yaml,md}&lt;/code&gt; (50 each)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large binary files&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;large_*.dat&lt;/code&gt; — 1 MB each (random data)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10,900&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="go"&gt;143M    .

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="go"&gt;10900

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; d | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="go"&gt;1506
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tools Tested
&lt;/h3&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;Version&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;find&lt;/code&gt; (GNU)&lt;/td&gt;
&lt;td&gt;4.9.0&lt;/td&gt;
&lt;td&gt;The OG. Ships with every Linux distro.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10.2.0&lt;/td&gt;
&lt;td&gt;Rust-based &lt;code&gt;find&lt;/code&gt; alternative. Smarter defaults, colored output.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;grep&lt;/code&gt; (GNU)&lt;/td&gt;
&lt;td&gt;3.11&lt;/td&gt;
&lt;td&gt;Content search. Also the OG.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;rg&lt;/code&gt; (ripgrep)&lt;/td&gt;
&lt;td&gt;15.1.0&lt;/td&gt;
&lt;td&gt;Rust-based &lt;code&gt;grep&lt;/code&gt; alternative. Respects &lt;code&gt;.gitignore&lt;/code&gt;, crazy fast.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All benchmarks run with &lt;code&gt;hyperfine --warmup 3 --runs 10&lt;/code&gt; on WSL2 Ubuntu, Intel i7, NVMe SSD.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark 1: Simple Filename Search (Find All &lt;code&gt;*.txt&lt;/code&gt; Files)
&lt;/h2&gt;

&lt;p&gt;This is the most common use case. You want every &lt;code&gt;.txt&lt;/code&gt; file in a project, recursively.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Ran
&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;# GNU find&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.txt'&lt;/span&gt;

&lt;span class="c"&gt;# fd (extension filter)&lt;/span&gt;
fd &lt;span class="nt"&gt;-e&lt;/span&gt; txt

&lt;span class="c"&gt;# ripgrep listing all files, piped to grep&lt;/span&gt;
rg &lt;span class="nt"&gt;--files&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'\.txt$'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Benchmark 1: find . -name '*.txt'
  Time (mean ± σ):      94.5 ms ±  17.6 ms    [User: 21.1 ms, System: 26.1 ms]
  Range (min … max):    74.8 ms … 139.9 ms    10 runs

Benchmark 1: fd -e txt
  Time (mean ± σ):      39.9 ms ±   8.2 ms    [User: 70.7 ms, System: 134.3 ms]
  Range (min … max):    30.8 ms …  55.3 ms    10 runs

&lt;/span&gt;&lt;span class="gp"&gt;Benchmark 1: rg --files | grep '\.txt$&lt;/span&gt;&lt;span class="s1"&gt;'
&lt;/span&gt;&lt;span class="go"&gt;  Time (mean ± σ):     117.6 ms ±  12.8 ms    [User: 51.5 ms, System: 106.0 ms]
  Range (min … max):   104.8 ms … 144.0 ms    10 runs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;Mean Time&lt;/th&gt;
&lt;th&gt;vs find&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fd -e txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39.9 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🏆 2.37x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;find . -name '*.txt'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;94.5 ms&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`rg --files \&lt;/td&gt;
&lt;td&gt;grep`&lt;/td&gt;
&lt;td&gt;117.6 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ⚠️ The Hidden Files Gotcha
&lt;/h3&gt;

&lt;p&gt;Here's something the benchmarks don't tell you — &lt;strong&gt;fd and find returned different results.&lt;/strong&gt;&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;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.txt'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
3500

&lt;span class="nv"&gt;$ &lt;/span&gt;fd &lt;span class="nt"&gt;-e&lt;/span&gt; txt | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fd&lt;/code&gt; skipped 500 &lt;code&gt;.txt&lt;/code&gt; files. Why? Because those 500 files live inside &lt;code&gt;.hidden_dir/&lt;/code&gt;, and &lt;strong&gt;fd ignores hidden directories by default.&lt;/strong&gt; It's not a bug — it's intentional. If you want parity with &lt;code&gt;find&lt;/code&gt;, you need the &lt;code&gt;-H&lt;/code&gt; flag:&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;fd &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; txt | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
3500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is either genius or infuriating depending on whether you knew about it before debugging for 20 minutes. (I was debugging for 20 minutes.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Winner: &lt;code&gt;fd&lt;/code&gt;&lt;/strong&gt; — but learn the &lt;code&gt;-H&lt;/code&gt; flag or it'll silently miss files.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark 2: Content Search (Find Files Containing "test")
&lt;/h2&gt;

&lt;p&gt;You need to know which files reference a string. Classic &lt;code&gt;grep&lt;/code&gt; territory.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Ran
&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;# GNU grep (excluding .git manually, suppressing permission errors)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--exclude-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.git 2&amp;gt;/dev/null

&lt;span class="c"&gt;# ripgrep (auto-excludes .git, hidden dirs, binaries)&lt;/span&gt;
rg &lt;span class="s1"&gt;'test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;Benchmark 1: grep -r 'test' . --exclude-dir=.git 2&amp;gt;&lt;/span&gt;/dev/null
&lt;span class="go"&gt;  Time (mean ± σ):     302.7 ms ±  50.8 ms    [User: 92.8 ms, System: 100.2 ms]
  Range (min … max):   228.6 ms … 370.8 ms    10 runs

Benchmark 1: rg 'test'
  Time (mean ± σ):     103.2 ms ±   6.8 ms    [User: 135.3 ms, System: 177.5 ms]
  Range (min … max):    95.3 ms … 116.0 ms    10 runs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;Mean Time&lt;/th&gt;
&lt;th&gt;vs grep&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rg 'test'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;103.2 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🏆 2.93x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grep -r 'test'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;302.7 ms&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And look at that consistency — &lt;code&gt;rg&lt;/code&gt; has a standard deviation of 6.8ms vs &lt;code&gt;grep&lt;/code&gt;'s 50.8ms. &lt;code&gt;rg&lt;/code&gt; is not just faster, it's &lt;em&gt;predictably&lt;/em&gt; faster.&lt;/p&gt;

&lt;p&gt;Both returned exactly 3,500 matches:&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;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--exclude-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.git 2&amp;gt;/dev/null | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
3500

&lt;span class="nv"&gt;$ &lt;/span&gt;rg &lt;span class="s1"&gt;'test'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
3500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unlike the filename search test, there's no hidden-file discrepancy here because our "test" string only appears in non-hidden files. But &lt;code&gt;rg&lt;/code&gt; is &lt;em&gt;still&lt;/em&gt; skipping hidden dirs and &lt;code&gt;.git&lt;/code&gt; by default — it just happened to not matter in this case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Winner: &lt;code&gt;rg&lt;/code&gt;&lt;/strong&gt; — not even close. 3x faster with zero tuning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark 3: Finding Hidden Files
&lt;/h2&gt;

&lt;p&gt;Sometimes you need to find all the dotfiles and dotdirs. Let's see who handles this best.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Ran
&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;# GNU find — no special flags needed, it sees everything&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'.*'&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f

&lt;span class="c"&gt;# fd — needs -H to include hidden stuff, regex anchor for dot-prefix&lt;/span&gt;
fd &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; f &lt;span class="s1"&gt;'^\.'&lt;/span&gt;

&lt;span class="c"&gt;# ripgrep — needs --hidden to see dotfiles&lt;/span&gt;
rg &lt;span class="nt"&gt;--hidden&lt;/span&gt; &lt;span class="nt"&gt;--files&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'^\.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Benchmark 1: find . -name '.*' -type f
  Time (mean ± σ):     104.3 ms ±  20.5 ms    [User: 16.0 ms, System: 27.6 ms]
  Range (min … max):    79.0 ms … 144.5 ms    10 runs

Benchmark 1: fd -H -t f '^\.'
  Time (mean ± σ):      40.5 ms ±   9.2 ms    [User: 56.9 ms, System: 106.0 ms]
  Range (min … max):    26.6 ms …  57.2 ms    10 runs

Benchmark 1: rg --hidden --files | grep '^\.'
  Time (mean ± σ):     118.8 ms ±   9.4 ms    [User: 64.4 ms, System: 93.3 ms]
  Range (min … max):   106.9 ms … 135.0 ms    10 runs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;Mean Time&lt;/th&gt;
&lt;th&gt;vs find&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fd -H -t f '^\.'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;40.5 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🏆 2.58x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;find . -name '.*' -type f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;104.3 ms&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`rg --hidden --files \&lt;/td&gt;
&lt;td&gt;grep`&lt;/td&gt;
&lt;td&gt;118.8 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three found exactly 1,500 hidden files (we excluded &lt;code&gt;.git/&lt;/code&gt; objects from this count).&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;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'.*'&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'./.git/*'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
1500

&lt;span class="nv"&gt;$ &lt;/span&gt;fd &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; f &lt;span class="s1"&gt;'^\.'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
1500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Winner: &lt;code&gt;fd&lt;/code&gt;&lt;/strong&gt; — once you remember &lt;code&gt;-H&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark 4: Ignoring &lt;code&gt;.git&lt;/code&gt; Directories
&lt;/h2&gt;

&lt;p&gt;This is one of &lt;code&gt;fd&lt;/code&gt; and &lt;code&gt;rg&lt;/code&gt;'s marquee features — they auto-ignore &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;.svn&lt;/code&gt;, and anything in &lt;code&gt;.gitignore&lt;/code&gt;. With &lt;code&gt;find&lt;/code&gt;, you have to do it manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Ran
&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;# GNU find — manual .git exclusion&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'./.git/*'&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# fd — auto-ignores .git AND hidden dirs&lt;/span&gt;
fd &lt;span class="nt"&gt;-t&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# ripgrep — auto-ignores .git AND hidden dirs&lt;/span&gt;
rg &lt;span class="nt"&gt;--files&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Benchmark 1: find . -not -path './.git/*' -type f | wc -l
  Time (mean ± σ):     139.2 ms ±  16.5 ms    [User: 27.9 ms, System: 37.6 ms]
  Range (min … max):   119.4 ms … 173.4 ms    10 runs

Benchmark 1: fd -t f | wc -l
  Time (mean ± σ):      85.4 ms ±  10.2 ms    [User: 82.9 ms, System: 118.2 ms]
  Range (min … max):    69.2 ms … 103.9 ms    10 runs

Benchmark 1: rg --files | wc -l
  Time (mean ± σ):     129.0 ms ±  12.2 ms    [User: 60.7 ms, System: 106.3 ms]
  Range (min … max):   111.4 ms … 151.3 ms    10 runs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;Mean Time&lt;/th&gt;
&lt;th&gt;vs find&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;`fd -t f \&lt;/td&gt;
&lt;td&gt;wc -l`&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.4 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`rg --files \&lt;/td&gt;
&lt;td&gt;wc -l`&lt;/td&gt;
&lt;td&gt;129.0 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`find . -not -path './.git/*' \&lt;/td&gt;
&lt;td&gt;wc -l`&lt;/td&gt;
&lt;td&gt;139.2 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  But Again: The Counts Don't Match
&lt;/h3&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;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'./.git/*'&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
10400

&lt;span class="nv"&gt;$ &lt;/span&gt;fd &lt;span class="nt"&gt;-t&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
8400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a 2,000-file discrepancy. Here's the breakdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10,900 total files&lt;/li&gt;
&lt;li&gt;Minus 500 &lt;code&gt;.git/&lt;/code&gt; objects = 10,400 (what &lt;code&gt;find&lt;/code&gt; reports with &lt;code&gt;-not -path&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Minus 2,000 hidden files/dirs = 8,400 (what &lt;code&gt;fd&lt;/code&gt; reports by default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;fd&lt;/code&gt; and &lt;code&gt;rg&lt;/code&gt; don't just skip &lt;code&gt;.git&lt;/code&gt; — they skip &lt;em&gt;all&lt;/em&gt; hidden files and directories. This is usually what you want (who searches &lt;code&gt;node_modules/.cache/&lt;/code&gt;?), but it's worth knowing.&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;fd &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;    &lt;span class="c"&gt;# with hidden files&lt;/span&gt;
10900
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Winner: &lt;code&gt;fd&lt;/code&gt;&lt;/strong&gt; — but understand what "ignore" actually means.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus Tests
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Finding Files by Path Pattern
&lt;/h3&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;&lt;span class="nb"&gt;time &lt;/span&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'*deep*'&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
1000
real    0m0.088s

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;time &lt;/span&gt;fd &lt;span class="s1"&gt;'deep'&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
500
real    0m0.094s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, &lt;code&gt;fd&lt;/code&gt; found half as many because &lt;code&gt;.hidden_dir/subdir/deep_hidden_*.txt&lt;/code&gt; (500 files) is in a hidden directory. With &lt;code&gt;-H&lt;/code&gt;:&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;fd &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'deep'&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Simple File Listing Speed
&lt;/h3&gt;

&lt;p&gt;When neither tool is filtering (just "list everything"), the performance gap narrows:&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;&lt;span class="nb"&gt;time &lt;/span&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
10900
real    0m0.110s

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;time &lt;/span&gt;fd &lt;span class="nt"&gt;-t&lt;/span&gt; f | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
8400
real    0m0.116s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At raw directory traversal, they're basically tied. &lt;code&gt;fd&lt;/code&gt;'s advantage comes from its smarter filtering and parallelism, not from faster syscalls.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Scorecard
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;th&gt;Margin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Filename search (&lt;code&gt;*.txt&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.37x over &lt;code&gt;find&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content search (&lt;code&gt;test&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.93x over &lt;code&gt;grep&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden file search&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.58x over &lt;code&gt;find&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.git exclusion + listing&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.63x over &lt;code&gt;find&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw listing (no filter)&lt;/td&gt;
&lt;td&gt;Tie&lt;/td&gt;
&lt;td&gt;~identical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Overall winner: &lt;code&gt;fd&lt;/code&gt; + &lt;code&gt;rg&lt;/code&gt; as a combo.&lt;/strong&gt; Replace &lt;code&gt;find&lt;/code&gt; with &lt;code&gt;fd&lt;/code&gt;, replace &lt;code&gt;grep&lt;/code&gt; with &lt;code&gt;rg&lt;/code&gt;. You'll never look back.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Talk: When to Use What
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;fd&lt;/code&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're doing any filename-based search (replace &lt;code&gt;find . -name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;You want smart defaults that skip &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;, hidden dirs&lt;/li&gt;
&lt;li&gt;You want colored, readable output out of the box&lt;/li&gt;
&lt;li&gt;You're typing into an interactive shell and want the shorter syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;find&lt;/code&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're writing a portable script that needs to run on &lt;em&gt;any&lt;/em&gt; Linux/Unix&lt;/li&gt;
&lt;li&gt;You need the insane flexibility of &lt;code&gt;-exec&lt;/code&gt; with complex predicates&lt;/li&gt;
&lt;li&gt;You're on a machine where you can't install Rust tooling (embedded, minimal containers)&lt;/li&gt;
&lt;li&gt;You need to search hidden files without remembering a flag&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;rg&lt;/code&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're searching file &lt;em&gt;contents&lt;/em&gt; (this is what it was built for)&lt;/li&gt;
&lt;li&gt;You want &lt;code&gt;.gitignore&lt;/code&gt;-aware searching (no more grepping through &lt;code&gt;node_modules&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;You need speed — it's SIMD-accelerated and uses memory mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;grep&lt;/code&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need POSIX compatibility in scripts&lt;/li&gt;
&lt;li&gt;You're piping from stdin with complex flags (&lt;code&gt;grep -oP&lt;/code&gt; with Perl regex is still great)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rg&lt;/code&gt; isn't installed and you can't install it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Pipe Combo Pattern (don't do this)
&lt;/h3&gt;

&lt;p&gt;I see this pattern a lot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="nt"&gt;--files&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'\.ts$'&lt;/span&gt; | xargs rg &lt;span class="s1"&gt;'useState'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is slow and redundant. Both &lt;code&gt;fd&lt;/code&gt; and &lt;code&gt;rg&lt;/code&gt; can filter by extension natively:&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;# Instead of the pipe combo:&lt;/span&gt;
fd &lt;span class="nt"&gt;-e&lt;/span&gt; ts &lt;span class="nt"&gt;-x&lt;/span&gt; rg &lt;span class="s1"&gt;'useState'&lt;/span&gt;

&lt;span class="c"&gt;# Or even better:&lt;/span&gt;
rg &lt;span class="nt"&gt;--type&lt;/span&gt; ts &lt;span class="s1"&gt;'useState'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command. No pipes. Faster.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;fd&lt;/code&gt; is genuinely faster for filename searches&lt;/strong&gt; — not by 10x like some blog posts claim, but a solid 2-2.5x in real-world use. That's worth the install.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;rg&lt;/code&gt; vs &lt;code&gt;grep&lt;/code&gt; isn't even a contest&lt;/strong&gt; — 3x faster with better defaults. If you take one thing from this article: &lt;code&gt;alias grep=rg&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hidden files will bite you.&lt;/strong&gt; Both &lt;code&gt;fd&lt;/code&gt; and &lt;code&gt;rg&lt;/code&gt; skip them by default. This is documented, but the first time you spend 30 minutes wondering why your &lt;code&gt;.env&lt;/code&gt; file isn't showing up, you'll remember to add &lt;code&gt;-H&lt;/code&gt; / &lt;code&gt;--hidden&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The ergonomics matter more than the speed.&lt;/strong&gt; Even if &lt;code&gt;fd&lt;/code&gt; were the same speed as &lt;code&gt;find&lt;/code&gt;, I'd still use it. &lt;code&gt;fd whatever&lt;/code&gt; is just nicer than &lt;code&gt;find . -name '*whatever*'&lt;/code&gt;. The speed is gravy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;hyperfine&lt;/code&gt; is a beautiful benchmarking tool.&lt;/strong&gt; If you're ever debating tool performance, just run the damn benchmark instead of arguing on Hacker News.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Reproduce This Yourself
&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;# Install the tools&lt;/span&gt;
cargo &lt;span class="nb"&gt;install &lt;/span&gt;fd-find ripgrep hyperfine
&lt;span class="c"&gt;# or: apt install fd-find ripgrep hyperfine&lt;/span&gt;

&lt;span class="c"&gt;# Clone my setup (approximate recreation):&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/fd-benchmark &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/fd-benchmark
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 2000&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"test content line &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"file_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.txt"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done
for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 1000&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hidden content &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;".hidden_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .hidden_dir/subdir
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 500&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deep hidden &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;".hidden_dir/subdir/deep_hidden_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.txt"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .git/objects
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 500&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"git object &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;".git/objects/obj_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="c"&gt;# ... etc. Full generation script in the article source.&lt;/span&gt;

&lt;span class="c"&gt;# Run the benchmarks&lt;/span&gt;
hyperfine &lt;span class="nt"&gt;-w&lt;/span&gt; 3 &lt;span class="nt"&gt;-r&lt;/span&gt; 10 &lt;span class="s2"&gt;"find . -name '*.txt'"&lt;/span&gt; &lt;span class="s2"&gt;"fd -e txt"&lt;/span&gt;
hyperfine &lt;span class="nt"&gt;-w&lt;/span&gt; 3 &lt;span class="nt"&gt;-r&lt;/span&gt; 10 &lt;span class="s2"&gt;"grep -r 'test' . --exclude-dir=.git"&lt;/span&gt; &lt;span class="s2"&gt;"rg 'test'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Last updated: May 2026. Tools tested: find 4.9.0, fd 10.2.0, grep 3.11, rg 15.1.0. Environment: WSL2 Ubuntu on NVMe SSD.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>cli</category>
      <category>linux</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Hidden Developer Tool Tax: How Much You're Really Spending Every Month</title>
      <dc:creator>Mike Chen</dc:creator>
      <pubDate>Fri, 29 May 2026 15:00:33 +0000</pubDate>
      <link>https://dev.to/fengloulai/the-hidden-developer-tool-tax-how-much-youre-really-spending-every-month-50c4</link>
      <guid>https://dev.to/fengloulai/the-hidden-developer-tool-tax-how-much-youre-really-spending-every-month-50c4</guid>
      <description>&lt;h1&gt;
  
  
  The Hidden Developer Tool Tax: How Much You're Really Spending Every Month
&lt;/h1&gt;

&lt;p&gt;I added up my subscriptions last weekend and almost threw up. Not a figure of speech. I literally stared at my screen, did the math three times, and felt a wave of nausea wash over me.&lt;/p&gt;

&lt;p&gt;I'm not talking about Netflix or Spotify. I'm talking about the tools I use to &lt;em&gt;do my job&lt;/em&gt;. The things I need to write code, push commits, and generally be a functioning developer in 2026.&lt;/p&gt;

&lt;p&gt;Here's the thing nobody tells you when you get into software development: there's a subscription tax. It creeps up on you. One day you're using free VS Code and pushing to GitHub, and the next you're somehow paying the equivalent of a car lease to a dozen different SaaS companies.&lt;/p&gt;

&lt;p&gt;Let me break this down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Cost of Being a Developer in 2026
&lt;/h2&gt;

&lt;p&gt;Here's what these tools actually cost, right now:&lt;/p&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;Monthly Cost&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;$10 (individual)&lt;/td&gt;
&lt;td&gt;AI code completion in your editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor Pro&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;AI-first IDE, 500 fast premium requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT Plus&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;General AI assistant, GPT-4 access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Pro&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;Anthropic's assistant, longer conversations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JetBrains All Products&lt;/td&gt;
&lt;td&gt;$24.90&lt;/td&gt;
&lt;td&gt;Every JetBrains IDE (annual billing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windsurf Pro&lt;/td&gt;
&lt;td&gt;$15&lt;/td&gt;
&lt;td&gt;AI coding IDE by Codeium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warp Pro&lt;/td&gt;
&lt;td&gt;$18&lt;/td&gt;
&lt;td&gt;AI-powered terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linear&lt;/td&gt;
&lt;td&gt;$8&lt;/td&gt;
&lt;td&gt;Issue tracking that doesn't suck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion Plus&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;td&gt;Docs, wikis, project management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Figma Professional&lt;/td&gt;
&lt;td&gt;$15&lt;/td&gt;
&lt;td&gt;UI/UX design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1Password&lt;/td&gt;
&lt;td&gt;$2.99&lt;/td&gt;
&lt;td&gt;Password management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Desktop&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;Container management (business use)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postman&lt;/td&gt;
&lt;td&gt;$14&lt;/td&gt;
&lt;td&gt;API testing and development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ngrok&lt;/td&gt;
&lt;td&gt;$8&lt;/td&gt;
&lt;td&gt;Local tunnel for webhooks and demos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These aren't made-up numbers. I checked every single pricing page. This is what you pay if you walk up today and subscribe.&lt;/p&gt;

&lt;p&gt;Now let's talk about what this looks like in real life, because nobody subscribes to &lt;em&gt;everything&lt;/em&gt;. But a lot of us subscribe to way more than we admit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 1: The "Essential Dev" — $67.89/month ($814.68/year)
&lt;/h2&gt;

&lt;p&gt;This is the baseline. The stuff you actually need to do your job effectively in 2026. I'm talking about a typical employed developer — not some AI-obsessed early adopter, just someone who wants decent tooling.&lt;/p&gt;

&lt;p&gt;Here's what that looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot ($10)&lt;/strong&gt; — At this point, coding without Copilot feels like typing with one hand. Every employed dev I know pays for this. Some employers cover it. Most don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT Plus ($20)&lt;/strong&gt; — For rubber-ducking architecture questions, generating boilerplate, and the 47 daily tasks that are too specific for Stack Overflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains All Products ($24.90)&lt;/strong&gt; — If you work across multiple languages, the all-products pack is actually a good deal. Annual billing saves you $4/month versus monthly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1Password ($2.99)&lt;/strong&gt; — Because reusing passwords in 2026 is how you end up on Have I Been Pwned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion Plus ($10)&lt;/strong&gt; — Documentation, sprint notes, personal knowledge base. The free tier runs out of storage surprisingly fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: $67.89/month. That's $814.68 per year.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For context, that's more than a Disney+ annual subscription, a decent phone plan, or roughly 16 burritos from Chipotle. And this is the &lt;em&gt;conservative&lt;/em&gt; estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 2: The "AI Power User" — $148.89/month ($1,786.68/year)
&lt;/h2&gt;

&lt;p&gt;This is where things get embarrassing. If you're the kind of developer who has opinions about which LLM is best for which task, this is you. I say this with love. I am this person.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Everything in Tier 1: $67.89&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor Pro ($20)&lt;/strong&gt; — Because sometimes Copilot isn't enough and you want an IDE that's built around AI from the ground up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Pro ($20)&lt;/strong&gt; — Anthropic's models are genuinely better at certain things — long-form code refactoring, architecture discussions, anything requiring deep reasoning. So you pay for both ChatGPT &lt;em&gt;and&lt;/em&gt; Claude.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windsurf Pro ($15)&lt;/strong&gt; — Maybe you're evaluating it against Cursor. Maybe you like the cascade mode. Either way, another $15 gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warp Pro ($18)&lt;/strong&gt; — AI in your terminal. Sounds ridiculous until you use it for a week and can't go back. The natural-language-to-command feature alone saves me from Googling "tar extract specific directory" for the 400th time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linear ($8)&lt;/strong&gt; — Because Jira makes you want to quit your job, and Linear is what project management looks like when the people building it actually use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: $148.89/month. That's $1,786.68 per year.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I want you to sit with that number for a second. Nearly two thousand dollars a year. On &lt;em&gt;developer tools&lt;/em&gt;. Tools that didn't exist five years ago. Tools that, if we're being honest, some of us are still figuring out how to use effectively.&lt;/p&gt;

&lt;p&gt;And we haven't even hit the full-stack indie tier yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 3: The "Full Stack Indie" — $194.89/month ($2,338.68/year)
&lt;/h2&gt;

&lt;p&gt;This is the solo developer or indie hacker who touches every part of the stack. Frontend, backend, design, infrastructure — you're doing it all, and you're paying for tools across every domain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Everything in Tier 2: $148.89&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Figma Professional ($15)&lt;/strong&gt; — You're designing your own UI, and Figma's free tier limits you to a handful of files. Professional gives you unlimited drafts and team libraries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Desktop ($9)&lt;/strong&gt; — The free version is fine for personal use, but if you're running a business (even a solo LLC), you technically need the paid tier. $9/month to avoid the license police.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postman ($14)&lt;/strong&gt; — Free Postman is surprisingly capable, but the moment you need collections with more than a few endpoints or want to share with a team, you're paying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ngrok ($8)&lt;/strong&gt; — Webhook testing, local demos for clients, exposing a dev server for a quick review. The free tier gives you one tunnel with a random URL that changes every time. The $8 plan gives you reserved domains and slightly longer sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: $194.89/month. That's $2,338.68 per year.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two thousand three hundred dollars. Every year. On subscriptions.&lt;/p&gt;

&lt;p&gt;I could buy a MacBook Air every three years with that money. I could fly to Europe. I could invest it and have something like $70,000 by the time I retire, assuming average market returns.&lt;/p&gt;

&lt;p&gt;Instead, I'm paying for seven different ways to generate code with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Free Alternatives That Actually Work
&lt;/h2&gt;

&lt;p&gt;Before you cancel everything and quit tech to become a farmer, let me tell you what I found when I actually tried to cut costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VS Code + free Copilot tier&lt;/strong&gt; — GitHub Copilot now offers 2,000 completions per month for free. If you're not a heavy user, this is genuinely enough. Combined with VS Code (which is free and excellent), you can skip both Copilot paid and JetBrains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bitwarden instead of 1Password&lt;/strong&gt; — Free, open-source, and does everything 1Password does. The UI isn't quite as polished, but your passwords don't care about polish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT/Claude free tiers&lt;/strong&gt; — Both have free tiers that are genuinely useful. You'll hit rate limits, but if you batch your questions instead of chatting with AI all day, it works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colima or Rancher Desktop instead of Docker Desktop&lt;/strong&gt; — Both are free, open-source, and do the same thing. Podman is also free and ships with most Linux distros.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linear free tier&lt;/strong&gt; — Surprisingly generous for solo developers. Unlimited issues, basic workflows. You only pay when you need teams or advanced views.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figma free tier&lt;/strong&gt; — You get three Figma and three FigJam files. If you're disciplined about archiving old work, this is enough for side projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bruno or Hoppscotch instead of Postman&lt;/strong&gt; — Bruno stores collections as plain text files in your repo, which means no vendor lock-in. Hoppscotch is a lightweight web-based alternative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notion free tier&lt;/strong&gt; — Generous for personal use. You only hit limits when collaborating with large teams or uploading tons of files.&lt;/p&gt;

&lt;p&gt;If I went full cheapskate, here's what I'd actually pay:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Copilot free tier: $0&lt;/li&gt;
&lt;li&gt;VS Code: $0&lt;/li&gt;
&lt;li&gt;ChatGPT free: $0&lt;/li&gt;
&lt;li&gt;Bitwarden: $0&lt;/li&gt;
&lt;li&gt;Linear free: $0&lt;/li&gt;
&lt;li&gt;Figma free: $0&lt;/li&gt;
&lt;li&gt;Bruno instead of Postman: $0&lt;/li&gt;
&lt;li&gt;ngrok free: $0&lt;/li&gt;
&lt;li&gt;Colima instead of Docker Desktop: $0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: $0/month.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zero dollars. The same tools I was paying nearly $200/month for, with slightly more generous limits and shinier UIs, are available for free. The functionality is 85% the same. The remaining 15% is mostly convenience, and I'm not sure convenience is worth two grand a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Audit Your Own Subscriptions
&lt;/h2&gt;

&lt;p&gt;Here's what I did. It took 15 minutes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open your bank app.&lt;/strong&gt; Search for "subscription," "monthly," or the name of every tool I listed above. You'll find things you forgot about. I found a Postman Pro subscription I hadn't used in four months.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write them all down.&lt;/strong&gt; Every single one. The total will probably be higher than you think. That's the point.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;For each one, ask yourself:&lt;/strong&gt; Did I use this in the last 30 days? If the answer is no, cancel it immediately. You can always resubscribe later — they make it very easy to give them money again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;For the ones you do use:&lt;/strong&gt; Is there a free alternative that does 80% of what you need? Try it for a week. Most of the time, 80% is actually enough.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Annual vs. monthly:&lt;/strong&gt; If you're keeping a subscription, switch to annual billing. Almost every tool gives you ~15-20% off. But only do this for things you're certain you'll use all year.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I'm not saying you should cancel everything and code in Notepad. Good tools are worth paying for. The developers who build these tools deserve to eat.&lt;/p&gt;

&lt;p&gt;But there's a difference between paying for tools that genuinely make you better at your job, and passively bleeding money to a dozen subscriptions you barely use.&lt;/p&gt;

&lt;p&gt;I did the audit. I canceled five subscriptions. I'm saving $86/month — over a thousand dollars a year. And the funny thing is, I don't miss any of them.&lt;/p&gt;

&lt;p&gt;The tool tax is real. But it's also optional. You just have to actually look at what you're paying, which — let's be honest — most of us have been avoiding.&lt;/p&gt;

&lt;p&gt;Go check your subscriptions. I'll wait.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Tested 5 AI Coding Tools for 30 Days — Here's What Actually Works</title>
      <dc:creator>Mike Chen</dc:creator>
      <pubDate>Wed, 27 May 2026 18:06:54 +0000</pubDate>
      <link>https://dev.to/fengloulai/i-tested-5-ai-coding-tools-for-30-days-heres-what-actually-works-2gja</link>
      <guid>https://dev.to/fengloulai/i-tested-5-ai-coding-tools-for-30-days-heres-what-actually-works-2gja</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest, hands-on comparison. No hype. Real test results where possible.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I spent a month putting five AI coding tools through their paces — from terminal-native CLI tools to full-blown AI IDEs. Some I tested directly. Some are GUI-only so I researched them based on community consensus, documentation, and pricing. Here's what I learned.&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;#&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Starting Price&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;GitHub Copilot&lt;/td&gt;
&lt;td&gt;IDE Extension + CLI&lt;/td&gt;
&lt;td&gt;Free / $10/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Terminal CLI&lt;/td&gt;
&lt;td&gt;Pay-per-use (Anthropic API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;GUI IDE (VS Code fork)&lt;/td&gt;
&lt;td&gt;Free / $20/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Windsurf&lt;/td&gt;
&lt;td&gt;GUI IDE&lt;/td&gt;
&lt;td&gt;Free / $15/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;Terminal CLI (open-source)&lt;/td&gt;
&lt;td&gt;Free + your own API key&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How I Tested
&lt;/h2&gt;

&lt;p&gt;For each tool where testing was possible, I ran real commands on a Linux (WSL) environment with Node.js v24 and Python 3 available. For GUI-only tools (Cursor, Windsurf), I compiled information from official docs, pricing pages, and community reports. Where a tool couldn't be tested (missing credentials, wrong package), I'm upfront about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. GitHub Copilot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What It Is
&lt;/h3&gt;

&lt;p&gt;The original AI coding assistant. GitHub Copilot started as inline code completions and has grown into a full suite: Chat, multi-file Edits, agent mode (Coding Agent), code review, and CLI access via &lt;code&gt;gh copilot&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt;: 2,000 completions/month + 50 chat messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Individual&lt;/strong&gt;: $10/month or $100/year (unlimited completions, unlimited chat)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business&lt;/strong&gt;: $19/user/month (adds org policies, IP indemnity)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise&lt;/strong&gt;: $39/user/month (adds custom models, knowledge bases)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Models Available
&lt;/h3&gt;

&lt;p&gt;GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 Flash, o1, o3-mini — you can switch between them.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Test Result: ❌ Could Not Test
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; CLI was not installed in my environment, so I couldn't run &lt;code&gt;gh copilot suggest&lt;/code&gt; or &lt;code&gt;gh copilot explain&lt;/code&gt;. Based on extensive community feedback, Copilot's inline completions remain the gold standard for speed, but its multi-file agent mode is still maturing compared to Cursor and Claude Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deepest IDE integration (VS Code, JetBrains, Neovim, Xcode)&lt;/li&gt;
&lt;li&gt;Fast, low-latency completions&lt;/li&gt;
&lt;li&gt;Multiple model choice&lt;/li&gt;
&lt;li&gt;Free tier is genuinely usable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Agent mode lags behind Cursor's Composer&lt;/li&gt;
&lt;li&gt;Chat context window is smaller than Claude Code&lt;/li&gt;
&lt;li&gt;$10/month adds up if you also pay for other tools&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Claude Code (CLI)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What It Is
&lt;/h3&gt;

&lt;p&gt;Anthropic's terminal-native AI coding agent. It runs in your terminal, reads your entire codebase, and can make multi-file edits, run tests, fix bugs, and handle git workflows — all from the command line. Think of it as an autonomous AI developer you talk to.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;Pay-per-use via the Anthropic API. &lt;strong&gt;Claude 3.5 Sonnet&lt;/strong&gt; costs ~$3/$15 per million input/output tokens. Max $200/month cap on the Max plan. Realistic monthly cost for active daily use: &lt;strong&gt;$10–$50&lt;/strong&gt; depending on project size.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @anthropic-ai/claude-code
&lt;span class="c"&gt;# Or install globally:&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  My Test Result: ✅ Installed, ⚠️ Requires Auth
&lt;/h3&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 &lt;span class="nt"&gt;--yes&lt;/span&gt; @anthropic-ai/claude-code &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Output: 2.1.152 (Claude Code)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code installed cleanly in under 10 seconds via &lt;code&gt;npx&lt;/code&gt;. However, running it requires an Anthropic API key and &lt;code&gt;/login&lt;/code&gt;. Without credentials, I couldn't test code generation — but the CLI itself was snappy and well-built. Community consensus: Claude Code is currently the best CLI agent for complex, multi-file tasks when budget isn't a concern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most capable CLI agent on the market&lt;/li&gt;
&lt;li&gt;Reads your entire codebase (not just open files)&lt;/li&gt;
&lt;li&gt;Autonomous bug-fixing and refactoring&lt;/li&gt;
&lt;li&gt;Git-aware — makes commits, manages branches&lt;/li&gt;
&lt;li&gt;No GUI overhead — works over SSH, in tmux, anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pay-per-use pricing can surprise you on big projects&lt;/li&gt;
&lt;li&gt;Requires Anthropic account + API key&lt;/li&gt;
&lt;li&gt;Slower than inline completions (it thinks before acting)&lt;/li&gt;
&lt;li&gt;Not an IDE — no autocomplete while you type&lt;/li&gt;
&lt;/ul&gt;




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

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Not directly tested&lt;/strong&gt; — GUI-only IDE, researched from official docs and community reports.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What It Is
&lt;/h3&gt;

&lt;p&gt;Cursor is a VS Code fork rebuilt from the ground up around AI. It doesn't just bolt AI onto an editor — the editor itself is designed for AI interaction. The key feature is &lt;strong&gt;Composer&lt;/strong&gt;, which can plan and execute multi-file changes autonomously, and &lt;strong&gt;Agent mode&lt;/strong&gt;, which can run terminal commands, install packages, and iterate on errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hobby (Free)&lt;/strong&gt;: 2,000 completions, 50 slow premium requests/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($20/month)&lt;/strong&gt;: Unlimited completions, 500 fast premium requests/month (+ $0.04/extra)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business ($40/user/month)&lt;/strong&gt;: Adds centralized billing, admin controls, privacy mode&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tab&lt;/strong&gt;: AI-powered next-edit prediction (better than Copilot's, many say)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cmd+K&lt;/strong&gt;: Inline editing — select code, describe the change, Cursor rewrites it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat with @codebase&lt;/strong&gt;: Ask questions about your entire project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composer&lt;/strong&gt;: Multi-file agent that plans then executes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent mode&lt;/strong&gt;: Composer on steroids — runs commands, fixes its own errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.cursorrules&lt;/strong&gt;: Project-wide AI behavior rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model choice&lt;/strong&gt;: Claude 3.5/3.7 Sonnet, GPT-4o, GPT-4.1, and custom models&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Best multi-file editing experience (Composer is genuinely impressive)&lt;/li&gt;
&lt;li&gt;Tab predictions feel more contextual than Copilot&lt;/li&gt;
&lt;li&gt;Agent mode can handle end-to-end tasks (build a feature, fix a bug)&lt;/li&gt;
&lt;li&gt;Privacy mode available (zero data retention on Business plan)&lt;/li&gt;
&lt;li&gt;Active development — features ship weekly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;$20/month is steep alongside other subscriptions&lt;/li&gt;
&lt;li&gt;500 fast requests run out quickly for power users (extra requests cost more)&lt;/li&gt;
&lt;li&gt;VS Code extension ecosystem works but occasional compatibility issues&lt;/li&gt;
&lt;li&gt;Privacy concerns — code passes through Cursor's servers (unless on Business plan)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Windsurf
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Not directly tested&lt;/strong&gt; — GUI-only IDE, researched from official docs and community reports.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What It Is
&lt;/h3&gt;

&lt;p&gt;Windsurf is Codeium's AI-native IDE. Its standout feature is &lt;strong&gt;Cascade&lt;/strong&gt;, a new interaction paradigm that blends autocomplete, chat, and agent behavior into a single "flow" — the AI continuously understands what you're doing and offers help proactively. It also has &lt;strong&gt;Supercomplete&lt;/strong&gt;, which predicts not just the next line but multi-line edits at your cursor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt;: Basic autocomplete + chat, 50 premium credits/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($15/month)&lt;/strong&gt;: Unlimited premium models, 1,500 credits/month ($0.01/extra)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams ($35/user/month)&lt;/strong&gt;: Admin tools, centralized billing&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cascade&lt;/strong&gt;: Hybrid copilot + agent in one continuous flow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supercomplete&lt;/strong&gt;: Multi-line edit predictions (not just text insertion)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Command (Cmd+I)&lt;/strong&gt;: Natural language edits at cursor position&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memories&lt;/strong&gt;: Learns your coding style and conventions over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Natural-language terminal&lt;/strong&gt;: Describe what you want in plain English&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-model&lt;/strong&gt;: Claude 3.5 Sonnet, GPT-4o, DeepSeek, Gemini, proprietary models&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cascade's "flow" feels more natural than switching between chat/composer&lt;/li&gt;
&lt;li&gt;Supercomplete is unique — predicts edits, not just completions&lt;/li&gt;
&lt;li&gt;Slightly cheaper than Cursor at $15/month&lt;/li&gt;
&lt;li&gt;Proprietary models handle basic tasks free (no API costs for them)&lt;/li&gt;
&lt;li&gt;Memories feature gets better the more you use it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Smaller community than Cursor — fewer tutorials, plugins, tips&lt;/li&gt;
&lt;li&gt;Cascade can be overly aggressive in offering changes&lt;/li&gt;
&lt;li&gt;1,500 credits/month can disappear fast on complex tasks&lt;/li&gt;
&lt;li&gt;Still maturing — occasional instability on edge cases&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Aider
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What It Is
&lt;/h3&gt;

&lt;p&gt;Aider is the open-source CLI champion. It's a terminal-based AI pair programmer that works with almost any LLM — Claude, GPT-4, local models via Ollama — and automatically commits changes to git. It builds a "repository map" so the AI understands your full codebase structure, not just the files you're editing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Free (MIT license).&lt;/strong&gt; You pay only for the API calls to your chosen LLM provider. With Claude 3.5 Sonnet at ~$3/$15 per million input/output tokens, active users typically spend &lt;strong&gt;$5–$20/month&lt;/strong&gt; on API costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aider-chat
&lt;span class="c"&gt;# Set your API key&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-ant-...  &lt;span class="c"&gt;# or OPENAI_API_KEY&lt;/span&gt;
&lt;span class="c"&gt;# Start coding&lt;/span&gt;
aider
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  My Test Result: ⚠️ Partial
&lt;/h3&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;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;aider-chat
&lt;span class="c"&gt;# WARNING: Package(s) not found: aider-chat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pip package failed due to PEP 668 environment restrictions in my WSL setup. Note: installing &lt;code&gt;aider&lt;/code&gt; (without &lt;code&gt;-chat&lt;/code&gt;) pulls an unrelated library — the correct package is &lt;strong&gt;&lt;code&gt;aider-chat&lt;/code&gt;&lt;/strong&gt;. Aider remains one of the most starred AI coding tools on GitHub (29k+ stars), and users consistently report it produces the highest-quality multi-file edits of any CLI tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Truly free&lt;/strong&gt; — no subscription, just API costs&lt;/li&gt;
&lt;li&gt;Works with any LLM — plug in Claude, GPT-4, Gemini, or local models&lt;/li&gt;
&lt;li&gt;Open-source — you can read the code, audit it, fork it&lt;/li&gt;
&lt;li&gt;Git integration — every edit is a clean commit, easy to revert&lt;/li&gt;
&lt;li&gt;Best-in-class codebase awareness via repository map&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/voice&lt;/code&gt; mode for hands-free coding&lt;/li&gt;
&lt;li&gt;Active community, fast iteration (architect/editor mode in v0.82+)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CLI-only — no mouse, no inline suggestions while you type&lt;/li&gt;
&lt;li&gt;Setup requires API keys and Python environment knowledge&lt;/li&gt;
&lt;li&gt;Not for non-technical users&lt;/li&gt;
&lt;li&gt;Repository map generation can be slow on large codebases&lt;/li&gt;
&lt;li&gt;No official IDE integration (community plugins exist but aren't polished)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;GitHub Copilot&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Windsurf&lt;/th&gt;
&lt;th&gt;Aider&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IDE Extension&lt;/td&gt;
&lt;td&gt;Terminal CLI&lt;/td&gt;
&lt;td&gt;GUI IDE&lt;/td&gt;
&lt;td&gt;GUI IDE&lt;/td&gt;
&lt;td&gt;Terminal CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Limited&lt;/td&gt;
&lt;td&gt;✅ Limited&lt;/td&gt;
&lt;td&gt;✅ (API only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paid starts at&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$10/mo&lt;/td&gt;
&lt;td&gt;Pay-per-use&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;$15/mo&lt;/td&gt;
&lt;td&gt;~$5–20/mo API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inline completions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;❌ N/A&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;❌ N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-file agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IDE integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code, JB, NeoVim&lt;/td&gt;
&lt;td&gt;Terminal only&lt;/td&gt;
&lt;td&gt;VS Code fork&lt;/td&gt;
&lt;td&gt;Standalone&lt;/td&gt;
&lt;td&gt;Terminal only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open-source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Git integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Daily typing&lt;/td&gt;
&lt;td&gt;Complex tasks&lt;/td&gt;
&lt;td&gt;Full workflow&lt;/td&gt;
&lt;td&gt;Flow-based dev&lt;/td&gt;
&lt;td&gt;Budget + control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Verdict: Which One Should You Use?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use GitHub Copilot if...
&lt;/h3&gt;

&lt;p&gt;You want the best inline completions that just work. Copilot's tab-complete is still the fastest way to write boilerplate, fill in patterns, and reduce keyboard mileage. The free tier is genuinely useful, and at $10/month it's the safest bet for most developers. Pair it with something else for complex agent tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Claude Code if...
&lt;/h3&gt;

&lt;p&gt;You work in the terminal, need an autonomous agent that understands your entire codebase, and don't mind pay-per-use pricing. It's the most capable CLI agent available — especially for large refactors, debugging sessions, and complex feature builds. A budget cap ($200/month Max plan) prevents surprises.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Cursor if...
&lt;/h3&gt;

&lt;p&gt;You want the best all-in-one AI coding experience. Cursor's Composer + Agent mode is the closest thing to "describe a feature and watch it get built." The Tab predictions are arguably better than Copilot's. At $20/month it's the premium option, but it replaces both Copilot and Claude Code for most workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Windsurf if...
&lt;/h3&gt;

&lt;p&gt;You like the idea of Cursor but want a more "flowy" experience and slightly lower price. Cascade's continuous-awareness paradigm feels different — more proactive, less back-and-forth. The Memories feature genuinely improves over time. At $15/month it undercuts Cursor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Aider if...
&lt;/h3&gt;

&lt;p&gt;You want maximum control, zero subscriptions, and don't mind the terminal. Aider with Claude 3.5 Sonnet produces some of the highest-quality code edits I've seen. It's open-source, works with local models via Ollama (privacy bonus), and its git workflow is the cleanest of any tool here. If you're comfortable in the terminal, this is the budget-power-user sweet spot.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Personal Stack
&lt;/h2&gt;

&lt;p&gt;After 30 days, here's what I landed on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for daily coding — Composer handles complex tasks, Tab handles the mundane&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; via &lt;code&gt;npx&lt;/code&gt; for one-off terminal tasks, large refactors, and when I'm working over SSH&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aider + Ollama&lt;/strong&gt; for privacy-sensitive projects where code must stay local&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total monthly cost: &lt;strong&gt;$20 (Cursor Pro) + ~$10 (Anthropic API) = ~$30/month.&lt;/strong&gt; Your mileage will vary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Honest Reality Check
&lt;/h2&gt;

&lt;p&gt;None of these tools are magic. They all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Produce bugs with confidence&lt;/li&gt;
&lt;li&gt;Hallucinate APIs that don't exist&lt;/li&gt;
&lt;li&gt;Need human review for every non-trivial change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But when used correctly — as accelerators, not replacements — they genuinely 2–3x coding speed on many tasks. The real skill is learning &lt;em&gt;when&lt;/em&gt; to trust the AI and &lt;em&gt;when&lt;/em&gt; to take over yourself. That's the part no tool can do for you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Last updated: May 2026. Pricing current as of publication date. Tested on WSL/Linux with Node.js v24.16.0 and Python 3.14.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
