<?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: Alvarito1983</title>
    <description>The latest articles on DEV Community by Alvarito1983 (@alvarito1983).</description>
    <link>https://dev.to/alvarito1983</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%2F3858088%2Fa0fbc217-d69f-4570-b98d-c85a5e01ed1d.png</url>
      <title>DEV Community: Alvarito1983</title>
      <link>https://dev.to/alvarito1983</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alvarito1983"/>
    <language>en</language>
    <item>
      <title>Meta's Muse Glimmer: a real agentic model that fits on your own GPU</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Tue, 11 Aug 2026 08:58:02 +0000</pubDate>
      <link>https://dev.to/alvarito1983/metas-muse-glimmer-a-real-agentic-model-that-fits-on-your-own-gpu-16oh</link>
      <guid>https://dev.to/alvarito1983/metas-muse-glimmer-a-real-agentic-model-that-fits-on-your-own-gpu-16oh</guid>
      <description>&lt;p&gt;On August 10th, Meta released Muse Glimmer, a 30-billion-parameter open model built specifically to run local AI agents on consumer hardware — scheduling, file organization, tool calling, multi-step tasks — without shipping any of it to Meta's servers. Weights are on Hugging Face under an Apache 2.0 license, so there's no commercial restriction on using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this one is different from the last wave of "local" models
&lt;/h2&gt;

&lt;p&gt;The 7B and 13B models that filled up Ollama's library over the last couple of years were solid text generators, but weak agents. Multi-step reasoning fell apart, tool calls failed halfway through, and they'd lose track of what happened three steps back in a task.&lt;/p&gt;

&lt;p&gt;Glimmer is Meta's answer to that gap specifically — it's a simplified, efficiency-focused derivative of Meta's larger Muse Spark 1.2 model, purpose-built for "always-on" agentic workflows: the kind of thing that needs to keep running continuously on a personal machine rather than answering one prompt at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually needs to run
&lt;/h2&gt;

&lt;p&gt;30B parameters, quantized memory footprint of 18–20 GB — within reach of current high-end consumer GPUs, no server rack required&lt;br&gt;
Handles interleaved text and images (screenshots, documents, mixed content) across 100+ languages&lt;br&gt;
Native support for the frameworks local-AI users already have installed: Ollama, LM Studio, llama.cpp, MLX, vLLM, SGLang — if you already pull models from Hugging Face, this drops into your existing workflow with no extra tooling&lt;br&gt;
Meta is also working with AMD, Arm, Dell, Intel, and NVIDIA on hardware-specific performance tuning, and providing documentation for building custom agent scaffolds on top of it&lt;br&gt;
The bigger picture&lt;/p&gt;

&lt;p&gt;Glimmer didn't launch alone — Meta paired it with a 14-page essay from Mark Zuckerberg ("The Future Is for Everyone") arguing against AI capability staying locked inside a handful of companies, and confirmed weights for the larger Muse Spark model are coming too. It's a direct response to the pressure open models are putting on the market: Chinese labs — Moonshot's Kimi K3, Alibaba's Qwen3.8-Max, DeepSeek's V4-Flash — are shipping performance that rivals closed US frontier labs, and open weights are consistently cheaper to run at scale, which matters to anyone watching their own inference bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in a self-hosted setup
&lt;/h2&gt;

&lt;p&gt;For anyone already running local models as part of a homelab — Ollama containers, a GPU passed through to a VM, that kind of setup — Glimmer is one of the first local models actually aimed at running unattended agent workflows instead of just answering chat prompts. That's a meaningfully different use case from "local chatbot," and worth testing against real tasks rather than benchmarks.&lt;/p&gt;

&lt;p&gt;I run local AI as part of my own homelab, so I'll be testing Glimmer against real agentic tasks rather than benchmarks — full writeup on El Rack once I've put it through its paces:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://elrack.es/herramientas-ia/muse-glimmer-meta/" rel="noopener noreferrer"&gt;Muse Glimmer, el nuevo modelo de Meta&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Spanish-language site — translation tools handle it cleanly if you don't read Spanish.)&lt;/p&gt;

&lt;p&gt;I write about homelab, self-hosting, and local AI at El Rack — real testing from inside my own homelab, not just a spec sheet rewrite.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>NVIDIA 610.57.04 for Linux: the point release actually worth installing</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Mon, 10 Aug 2026 12:03:11 +0000</pubDate>
      <link>https://dev.to/alvarito1983/nvidia-6105704-for-linux-the-point-release-actually-worth-installing-2phf</link>
      <guid>https://dev.to/alvarito1983/nvidia-6105704-for-linux-the-point-release-actually-worth-installing-2phf</guid>
      <description>&lt;p&gt;On August 3rd, NVIDIA quietly shipped two Linux driver branches on the same day: the new feature branch 610.57.04 and the stable 595.91.07. The stable release is the usual "minor bug fixes and improvements" non-answer, but 610.57.04 is a different story — it carries an unusually large fix list for a point release, and if you're gaming on Linux with an NVIDIA card, it's worth grabbing now instead of leaving it to rot in your package manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually got fixed
&lt;/h2&gt;

&lt;p&gt;More than 20 titles are patched in this release, several of which had been broken for weeks or months:&lt;/p&gt;

&lt;p&gt;STALKER 2: Heart of Chornobyl — crash with VK_DEVICE_LOST&lt;br&gt;
Assetto Corsa EVO — incorrectly wrapped textures&lt;br&gt;
Monster Hunter Wilds — crash at the main menu (driver reporting the GPU as unresponsive)&lt;br&gt;
Forza Horizon 6 — GPU hangs tied to the VKD3D-Proton descriptor heap feature&lt;br&gt;
Elden Ring and Elden Ring Nightreign&lt;br&gt;
Plus fixes touching Assassin's Creed Origins, Total War: Warhammer III, Crimson Desert, X-Plane, and a long tail of smaller titles (007 First Light, Grounded 2, Star Rupture, Windrose, and others)&lt;/p&gt;

&lt;h2&gt;
  
  
  Outside of gaming fixes, two changes matter for general desktop stability:
&lt;/h2&gt;

&lt;p&gt;A fix for an X Server crash under GLX indirect rendering&lt;br&gt;
A fix for black screens after modesets in X11 apps using the Present extension&lt;/p&gt;

&lt;p&gt;For anyone running a Turing-generation GPU or newer, installation has also gotten noticeably less painful — modeset configuration is now handled automatically, closer to a plug-and-play experience than the manual dance NVIDIA-on-Linux has traditionally required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you actually install it?
&lt;/h2&gt;

&lt;p&gt;If you're not chasing bleeding-edge features and just want the most predictable driver, 595.91.07 (the parallel stable release) is the safer pick. But if any of the games above have been giving you trouble, or you've been holding off on an update because previous 610-branch builds felt rough, this specific point release is the one that closes out most of those complaints — 610.57.04 was the first release in the R610 feature branch back in late May, and this is the point release that actually fixes what broke on launch.&lt;/p&gt;

&lt;p&gt;The installer is available directly from NVIDIA (~442 MB), with DKMS, RPM, and deb packages supported out of the box. If you're new to NVIDIA-on-Linux, installing through the .run file is still not the recommended path for beginners — wait for your distro's packaged version if you can, since it's much harder to break.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full verdict and version comparison
&lt;/h2&gt;

&lt;p&gt;I run this driver daily on my own homelab/gaming setup, so I put together a deeper breakdown — full version comparison table, install notes, and my actual verdict after running it for real — over on El Rack:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://elrack.es/gaming/nvidia-driver-610-57-04-linux/" rel="noopener noreferrer"&gt;Driver NVIDIA 610.57.04 para Linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Spanish-language site — the specs table, version numbers, and rating are readable regardless, and translation tools handle the rest cleanly if you want the full writeup.)&lt;/p&gt;

&lt;p&gt;I write about homelab, self-hosting, and Linux gaming at El Rack — real testing from inside my own homelab, not just a spec sheet rewrite.&lt;/p&gt;

</description>
      <category>nvidia</category>
      <category>linux</category>
      <category>gaming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Claude Code Now Runs Subagents in the Background by Default — What Actually Changed</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Fri, 07 Aug 2026 07:15:58 +0000</pubDate>
      <link>https://dev.to/alvarito1983/claude-code-now-runs-subagents-in-the-background-by-default-what-actually-changed-54kb</link>
      <guid>https://dev.to/alvarito1983/claude-code-now-runs-subagents-in-the-background-by-default-what-actually-changed-54kb</guid>
      <description>&lt;p&gt;Original article in Spanish on El Rack: Claude Code ya no espera a que le mires: subagentes en segundo plano por defecto&lt;/p&gt;

&lt;p&gt;I run Claude Code daily as my main dev agent, both locally and over SSH against a VPS running a handful of production sites. A change that landed over the last few weeks quietly rewired how I work with it: subagents now run in the background by default.&lt;/p&gt;

&lt;p&gt;Before, when Code delegated a task to a subagent, the conversation blocked until that subagent finished. Since July 1, it keeps working on other things while the subagent runs, and notifies you when it's done. For anyone running long sessions with &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; and checking back hours later, that's the difference between a tool that waits and one that actually works unattended.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes day to day
&lt;/h2&gt;

&lt;p&gt;My workflow has always been the same: approve the initial plan, then let Code proceed without confirmation on every step, stopping only on real errors. With background subagents, that autonomy compounds. I can now ask it to audit a site, generate new content, and review config files at the same time — each running as an independent subagent instead of queuing one after another.&lt;/p&gt;

&lt;p&gt;Two limits matter here: a default cap of 20 concurrent subagents, and nesting now allowed up to 3 levels deep (up from 1). Both exist for a reason — it's easy for a large task to branch further than you expect if nothing constrains it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sonnet 5 and Opus 5: 1M context is no longer the exception
&lt;/h2&gt;

&lt;p&gt;Claude Sonnet 5 became the default model in late June, with a native 1M-token context window. Claude Opus 5 replaced it as the default Opus model on July 24, also with 1M context. In long sessions — the kind you get during a full editorial rebuild of a site — I used to watch &lt;code&gt;/context&lt;/code&gt; and run &lt;code&gt;/compact&lt;/code&gt; mid-task to avoid losing thread. Now I run noticeably longer sessions without touching either. It's not magic: auto-compaction still kicks in, and cost on very long Opus sessions is worth watching, but the practical ceiling moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The security fix that actually matters
&lt;/h2&gt;

&lt;p&gt;As someone who manages production infrastructure, this is the line item I care about most: in August, a fix landed for worktree-isolated sessions (and their subagents) that could run destructive git commands against the main checkout. When you're launching subagents with broad permissions against something that matters, broken isolation like that is exactly the failure mode you don't want. That it got closed quickly is a good sign — but also a reminder that "autonomous" and "unsupervised" aren't the same thing. I still review the final report of every session rather than assuming no visible errors means everything went well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I still draw lines
&lt;/h2&gt;

&lt;p&gt;With this much autonomy, the temptation is to hand off increasingly ambitious tasks and walk away. I don't do that on anything touching client-facing production servers — those sessions stay interactive, with explicit confirmation on sensitive steps. Where I do give it full rein is on my own infrastructure, where the cost of a mistake is low and recoverable. That distinction, more than any config flag, is what actually determines how much autonomy a session gets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Background-by-default subagents are the change that's altered my day-to-day with Claude Code the most in months — not because it's flashy, but because it fits how I was already using it: approve the plan, let it run. The 1M context on Sonnet 5 and Opus 5 supports that well. The worktree isolation fix is the reminder that more autonomy means reviewing final output more carefully, not less.&lt;/p&gt;




&lt;p&gt;Original (Spanish, full version with pros/cons and more context): &lt;a href="https://dev.tourl"&gt;&lt;/a&gt;&lt;a href="https://elrack.es/herramientas-ia/claude-code-subagentes-segundo-plano-opus-5-2026/" rel="noopener noreferrer"&gt;https://elrack.es/herramientas-ia/claude-code-subagentes-segundo-plano-opus-5-2026/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>claude</category>
      <category>llm</category>
    </item>
    <item>
      <title>Kimi K3 is the largest open-weight model ever released — and you probably still can't run it</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Thu, 06 Aug 2026 06:45:20 +0000</pubDate>
      <link>https://dev.to/alvarito1983/kimi-k3-is-the-largest-open-weight-model-ever-released-and-you-probably-still-cant-run-it-1nn3</link>
      <guid>https://dev.to/alvarito1983/kimi-k3-is-the-largest-open-weight-model-ever-released-and-you-probably-still-cant-run-it-1nn3</guid>
      <description>&lt;p&gt;Originally published in Spanish on El Rack. Browser translation handles the rest of the site fine if you're into homelab/self-hosting content.&lt;/p&gt;

&lt;p&gt;Moonshot AI released Kimi K3 on July 17, 2026, and made the weights publicly downloadable on July 27. At 2.8 trillion parameters, it's the largest open-weight model ever published — and according to multiple benchmarks, it rivals Claude Opus and GPT on coding, reasoning, and general knowledge work, at a fraction of the training cost.&lt;/p&gt;

&lt;p&gt;The New York Times ran an in-depth piece on it a few days after release, which tells you this isn't just another model drop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "open weights" actually gets you here
&lt;/h2&gt;

&lt;p&gt;Publicly downloadable weights mean any company or researcher can run this locally and modify it without depending on a third-party API. If you already run Ollama or LM Studio in your homelab, that's the tempting part: a frontier-level model, no monthly quota, running on your own hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical reality is different.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"2.8 trillion parameters isn't a number that runs on homelab hardware — it needs an enterprise-grade GPU cluster. The weight release is real, but "downloadable" and "runnable" are very different things at this scale."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The bigger debate this reopened
&lt;/h2&gt;

&lt;p&gt;What makes Kimi K3 interesting isn't just the benchmark numbers — it's what it represents in the ongoing dispute over AI's geopolitics. The same fracture that opened up around DeepSeek-R1 in January 2025 is back: some argue US labs need to close up more in response to Chinese competition, others see openness as the only real way to stay relevant against an ecosystem that ships open weights at a pace closed labs can't match on transparency. There's also a real technical concern underneath: the possibility that outside actors use massive querying of closed American models to distill their outputs and train competing open models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this actually matters for a homelab
&lt;/h2&gt;

&lt;p&gt;Even though K3 itself is unrunnable on consumer hardware, its release pushes down what smaller, actually-runnable models (7B-70B, the ones that fit on a consumer GPU) can eventually achieve — research and techniques from frontier releases like this tend to filter down, via distillation, into much more manageable versions. Ollama's ecosystem usually adds support for distilled variants of these releases within days or weeks.&lt;/p&gt;




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

&lt;p&gt;Kimi K3 isn't something you're installing in your homelab this week, but it's a meaningful signal of where open AI is heading — and probably the source of much smaller, distilled versions that will show up in Ollama soon. Worth tracking not for what you can run today, but for what it anticipates for the near future.&lt;/p&gt;

&lt;p&gt;Full article (in Spanish): &lt;a href="https://dev.tourl"&gt;&lt;/a&gt; &lt;a href="https://elrack.es/herramientas-ia/kimi-k3/" rel="noopener noreferrer"&gt;https://elrack.es/herramientas-ia/kimi-k3/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>The MCP servers actually worth installing in Claude Code (2026) Published</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Wed, 05 Aug 2026 07:15:44 +0000</pubDate>
      <link>https://dev.to/alvarito1983/the-mcp-servers-actually-worth-installing-in-claude-code-2026published-43lb</link>
      <guid>https://dev.to/alvarito1983/the-mcp-servers-actually-worth-installing-in-claude-code-2026published-43lb</guid>
      <description>&lt;p&gt;Originally published in Spanish on El Rack, a Spanish tech review site I write for. Browser translation handles the rest of the site well if you want to dig deeper into the sysadmin/homelab content.&lt;/p&gt;

&lt;p&gt;Claude Code is my main tool every day for managing a handful of self-hosted projects. So when "just install these 10 MCP servers" guides kept showing up in every forum thread, I wanted to actually separate what's worth the setup time from what's just noise sitting in your context window.&lt;/p&gt;

&lt;p&gt;Here's what I found after digging into the current state of the ecosystem.&lt;/p&gt;

&lt;p&gt;The cost nobody mentions before you install ten of these&lt;/p&gt;

&lt;p&gt;Before the list: the one number that matters most. Every connected MCP server injects somewhere between 2,000 and 5,000 tokens of tool schemas at session start. Three servers connected at once is already 6,000 to 15,000 tokens spent before you type your first prompt.&lt;/p&gt;

&lt;p&gt;That's not free, even though it feels like it. If Claude Code feels slower to start or seems to "forget" context earlier than you'd expect, check how many MCP servers you're leaving connected by default.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Correction (added after publishing): Claude Code now enables Tool Search by default, which defers MCP schema loading until a tool is actually used — a connected-but-idle server now costs closer to a name-and-description stub than a full schema dump. The 2,000–5,000 token figure above was accurate before this became the default, and still applies if you disable Tool Search or if a given server doesn't support deferred loading yet. Thanks to a reader for catching this in the comments.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;MCP is convenient. It is not free. Every server you connect is tokens that are no longer available for your own code.&lt;/p&gt;

&lt;p&gt;The three actually worth installing first&lt;/p&gt;

&lt;p&gt;Independent guides keep converging on the same top three, and after using them daily, I agree with the consensus:&lt;/p&gt;

&lt;p&gt;Context7 — live library documentation, so Claude doesn't hallucinate APIs that changed three versions ago. This is the one that's saved me the most from confidently-wrong code suggestions based on outdated library docs.&lt;/p&gt;

&lt;p&gt;Official GitHub MCP — repo operations, pull requests, issues and CI, without leaving the chat. One caveat on the token cost above: for simple lookups, the gh CLI is still much cheaper than going through MCP.&lt;/p&gt;

&lt;p&gt;Playwright MCP — lets Claude drive a real browser to confirm a frontend change actually renders correctly, instead of just trusting the code diff. If you do any frontend work, this is the difference between "the code compiles" and "the code actually works."&lt;/p&gt;

&lt;p&gt;Two that Anthropic still maintains but aren't essential anymore&lt;/p&gt;

&lt;p&gt;The original reference servers for structured reasoning and file operations are still around, but the general consensus is honest about it: native model reasoning improved enough through 2026 that most people skip the reasoning server entirely, and Claude Code already ships built-in file tools that make the equivalent MCP mostly redundant.&lt;/p&gt;

&lt;p&gt;The governance shift that matters long-term&lt;/p&gt;

&lt;p&gt;In December 2025, MCP governance moved from Anthropic alone to the Agentic AI Foundation under the Linux Foundation, with Anthropic, OpenAI, Google, Microsoft, AWS, Cloudflare and Bloomberg on the board. In practice, this means vendor-maintained servers (Slack's own MCP, GitHub's own MCP) tend to be more reliable than generic third-party integrations — each company simply knows its own service better than any middleman.&lt;/p&gt;

&lt;p&gt;Best MCP for a specific task&lt;/p&gt;

&lt;p&gt;If you don't want to read the full ranking, here's the direct answer for whatever you're trying to solve:&lt;/p&gt;

&lt;p&gt;Working with your database → The PostgreSQL MCP if you run Postgres on any provider, or the official Supabase MCP if your backend lives there specifically (you can scope it to a single project via a URL parameter — good security practice).&lt;/p&gt;

&lt;p&gt;Repo management → The official GitHub MCP, already covered above.&lt;/p&gt;

&lt;p&gt;Verifying frontend actually works → Playwright, also covered above.&lt;/p&gt;

&lt;p&gt;Project docs and knowledge base → The Notion MCP, if your team documents there — keeps pages synced with code changes automatically.&lt;/p&gt;

&lt;p&gt;Task management → The Linear MCP, the most widely adopted for this.&lt;/p&gt;

&lt;p&gt;Production error monitoring → The Sentry MCP — brings real production error context straight into the chat instead of copy-pasting logs by hand.&lt;/p&gt;

&lt;p&gt;Design → The Figma MCP — pulls measurements, components and assets directly from published designs.&lt;/p&gt;

&lt;p&gt;Notifying a team → The Slack MCP — post deployment updates or task results without leaving the session.&lt;/p&gt;

&lt;p&gt;The question isn't "which MCP servers exist" — it's "which task do I repeat constantly that could be solved without switching windows." That question gets you a better answer than any generic ranking.&lt;/p&gt;

&lt;p&gt;When to use MCP and when not to&lt;/p&gt;

&lt;p&gt;The rule that sums it up best: use a CLI when latency and tokens matter and you can make a direct shell call; use an MCP server when you want the same tool available across Claude Code, Cursor and other clients with one config; use a Skill when the workflow is a set of instructions, not an external tool to call.&lt;/p&gt;

&lt;p&gt;Full article (in Spanish) with more detail: elrack.es/herramientas-ia/mejores-mcp-claude-code-2026&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>mcp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I asked Claude Code to refactor a feature it built last week. It hated its own code.</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Mon, 27 Apr 2026 08:50:42 +0000</pubDate>
      <link>https://dev.to/alvarito1983/i-asked-claude-code-to-refactor-a-feature-it-built-last-week-it-hated-its-own-code-ep8</link>
      <guid>https://dev.to/alvarito1983/i-asked-claude-code-to-refactor-a-feature-it-built-last-week-it-hated-its-own-code-ep8</guid>
      <description>&lt;p&gt;Last week I opened a feature I'd built six days earlier and asked Claude Code to extend it.&lt;/p&gt;

&lt;p&gt;I hadn't touched the file since. The code was working. Tests passing. Nothing was on fire. I just wanted to add a small capability — fifteen minutes of work, maybe.&lt;/p&gt;

&lt;p&gt;What I got back wasn't an extension. It was a quiet roast.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Before extending this, I'd recommend refactoring. The current implementation has a few issues: the error handling is inconsistent, the function is doing more than its name suggests, and there's a duplicated validation block that should be a helper. Want me to fix those first?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reader, that code was written by Claude Code. Same project. Same model tier. Six days earlier. By the same agent that was now telling me, with polite confidence, that it was a mess.&lt;/p&gt;

&lt;p&gt;I sat with that for a minute. Then I started thinking about what it meant. Because the more I thought, the more I realized that this — this exact moment — is the thing nobody is writing about with AI coding agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "memory problem" everyone complains about
&lt;/h2&gt;

&lt;p&gt;If you've used Claude Code, Codex, Cursor in agent mode, or any of the rest, you've hit it: agents don't have continuity between sessions. Every new conversation starts cold. They don't remember what they decided last Tuesday. They don't remember why a particular abstraction exists. They don't remember that you already debated naming this function and settled on something specific.&lt;/p&gt;

&lt;p&gt;Most of the discourse treats this as a problem to solve. We bolt on memory systems. We pile up CLAUDE.md files. We build context-loading scripts. The implicit assumption is that the agent &lt;em&gt;should&lt;/em&gt; remember, and the work is to compensate for the fact that it doesn't.&lt;/p&gt;

&lt;p&gt;I'm starting to think that framing is exactly backwards.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually happened in that session
&lt;/h2&gt;

&lt;p&gt;When Claude Code criticized its own code from six days earlier, it wasn't being inconsistent. It wasn't malfunctioning. It was being &lt;em&gt;honest&lt;/em&gt; — in a way no human collaborator can.&lt;/p&gt;

&lt;p&gt;Think about what just happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A reviewer with no ego attachment to the code looked at it fresh.&lt;/li&gt;
&lt;li&gt;It had no memory of why we wrote it that way, what we'd ruled out, what compromises we made under time pressure, or what I muttered at 11pm when the test finally passed.&lt;/li&gt;
&lt;li&gt;It just looked at the code on its merits and said: &lt;em&gt;this could be better.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a bug. That's the cleanest code review you'll ever get.&lt;/p&gt;

&lt;p&gt;A human reviewing their own code from a week ago has every cognitive bias working against them. They remember the constraints. They remember the deadline. They remember that they "knew" the helper was duplicated but didn't want to break the function signature. They protect their past decisions because their past decisions are &lt;em&gt;theirs&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code, with no continuity, has none of that. Every session is a new pair of eyes that hasn't been bought off by yesterday's reasoning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The reframe
&lt;/h2&gt;

&lt;p&gt;Once I saw this, I started doing it on purpose.&lt;/p&gt;

&lt;p&gt;When I finish a feature now, I don't immediately ship it. I commit, sleep on it, and the next morning I open a new Claude Code session and ask it to review the code as if it had never seen it. Because for that session, it hasn't.&lt;/p&gt;

&lt;p&gt;The reviews are brutal. They are also, almost always, right.&lt;/p&gt;

&lt;p&gt;It catches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functions that are doing two things and lying about it in their name&lt;/li&gt;
&lt;li&gt;Error handling that's defensive in some places and absent in others&lt;/li&gt;
&lt;li&gt;Helpers I should have extracted but didn't&lt;/li&gt;
&lt;li&gt;Naming that made sense in context but doesn't survive cold reading&lt;/li&gt;
&lt;li&gt;Tests that pass but verify the wrong thing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same agent that wrote the code can't see these issues &lt;em&gt;while it's writing&lt;/em&gt;, because it has the same tunnel vision a human does in flow. But strip its memory of the session, hand it the file, and it becomes the reviewer it could never be in real-time.&lt;/p&gt;

&lt;p&gt;The "memory problem" is actually a feature gate to a different mode of useful behavior. We've been trying to remove it instead of using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this changes how I think about CLAUDE.md
&lt;/h2&gt;

&lt;p&gt;I've written about CLAUDE.md before, and I want to refine what I said there, because this experience clarified something for me.&lt;/p&gt;

&lt;p&gt;CLAUDE.md is not the agent's memory. That framing is wrong.&lt;/p&gt;

&lt;p&gt;CLAUDE.md is the project's memory of decisions that shouldn't be relitigated every session. Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"We use Tailwind v3, not v4. Don't migrate."&lt;/li&gt;
&lt;li&gt;"The auth layer is intentionally simple. Don't add OAuth without asking."&lt;/li&gt;
&lt;li&gt;"Tests live next to source files, not in /tests."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are &lt;em&gt;decisions&lt;/em&gt;, not &lt;em&gt;style&lt;/em&gt;. CLAUDE.md exists so the agent doesn't waste a session arguing with itself about settled choices.&lt;/p&gt;

&lt;p&gt;But CLAUDE.md should &lt;em&gt;not&lt;/em&gt; contain things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"This function does X" (the code says that)&lt;/li&gt;
&lt;li&gt;"Last week we refactored Y" (that's history, not a decision)&lt;/li&gt;
&lt;li&gt;"The pattern we use is Z" (let the code be the source of truth)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mistake is using CLAUDE.md as a memory dump. When you do that, you're trying to give the agent continuity — and you lose the fresh-eyes review benefit. You've turned your honest reviewer into a yes-man who already agrees with everything you've decided.&lt;/p&gt;

&lt;p&gt;The right CLAUDE.md is short. It pins down decisions. It leaves &lt;em&gt;judgment&lt;/em&gt; alone, so a new session can still tell you when your code is bad.&lt;/p&gt;




&lt;h2&gt;
  
  
  The mental model shift
&lt;/h2&gt;

&lt;p&gt;Stop thinking of an AI coding agent as one consistent collaborator across time.&lt;/p&gt;

&lt;p&gt;Start thinking of it as a high-quality reviewer you can summon, fresh, as many times as you want — provided you preserve the decisions, not the reasoning.&lt;/p&gt;

&lt;p&gt;This changes the workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write code with the agent in a session.&lt;/li&gt;
&lt;li&gt;Commit when it works.&lt;/li&gt;
&lt;li&gt;Open a new session the next day. Ask it to review.&lt;/li&gt;
&lt;li&gt;Take the criticism seriously. It's coming from someone who isn't defending yesterday's choices.&lt;/li&gt;
&lt;li&gt;If the criticism is wrong, that's a signal that a &lt;em&gt;decision&lt;/em&gt; is missing from CLAUDE.md.&lt;/li&gt;
&lt;li&gt;If the criticism is right, fix it. The fact that the same agent wrote the code is irrelevant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've started shipping noticeably cleaner code since I adopted this. Not because Claude Code got smarter. Because I stopped trying to glue together its sessions and started using the gaps between them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The closing thought
&lt;/h2&gt;

&lt;p&gt;There's a lot of energy right now going into making AI agents more continuous, more memory-rich, more "aware" across sessions. Long-running agents. Persistent context. Memory layers.&lt;/p&gt;

&lt;p&gt;I'm not against any of that. But I think the rush is hiding something valuable. The discontinuity between sessions is the thing that lets the agent be a real reviewer instead of a sympathetic teammate. Once you give it perfect memory, it stops being able to look at your code from outside, and it starts protecting your past decisions the way a human would.&lt;/p&gt;

&lt;p&gt;Maybe the goal isn't to give agents continuity. Maybe it's to give them just enough of it — your settled decisions — and protect the rest. Let them forget how the code got that way. Let them tell you, fresh, that it's bad.&lt;/p&gt;

&lt;p&gt;Mine did. It was right.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Has Claude Code ever roasted its own past output in your projects? I want to hear the worst one — drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The AI Coding Tools Panorama in 2026: From Claude Code to the Free Alternatives That Actually Replace It</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Sat, 25 Apr 2026 16:18:39 +0000</pubDate>
      <link>https://dev.to/alvarito1983/the-ai-coding-tools-panorama-in-2026-from-claude-code-to-the-free-alternatives-that-actually-1p0a</link>
      <guid>https://dev.to/alvarito1983/the-ai-coding-tools-panorama-in-2026-from-claude-code-to-the-free-alternatives-that-actually-1p0a</guid>
      <description>&lt;p&gt;The AI coding tool space in 2026 looks nothing like it did 18 months ago. Autocomplete is a solved problem. The interesting question now is: which agent do you trust to read your codebase, plan a refactor, run your tests, and not torch your API budget while doing it.&lt;/p&gt;

&lt;p&gt;I've been using these tools daily for the last year on a real project — a Docker management suite I'm building solo, where the cost of a bad refactor is hours of cleanup. That context matters, because most "best AI coding tools" lists rank by benchmark scores. Benchmarks measure isolated tasks. They don't measure what happens at hour three of a complex migration when the agent forgets which files it already touched.&lt;/p&gt;

&lt;p&gt;This is the honest panorama from someone shipping production code. From the ones everyone knows to the ones that quietly outperform them. Then two opinionated rankings: the five paid tools that justify their price, and the five free ones that make you question whether you need to pay at all.&lt;/p&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The full panorama
&lt;/h2&gt;

&lt;p&gt;The space has split into clear layers. Most developers running serious AI workflows use 2–3 tools, not one — and once you understand the layers, the picking gets easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: Inline assistants (autocomplete + chat in your editor)
&lt;/h3&gt;

&lt;p&gt;These are what most people still think "AI coding" means. They suggest the next line, complete a function, answer a quick question. Low cognitive overhead, high frequency, low ambition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; is the default. 76% of developers have heard of it, 29% use it at work, and at $10/month for Pro it's the cheapest entry point that doesn't feel like a compromise. It ships in every editor that matters and just works. The growth has stalled — adoption has plateaued — but it's still the safest choice for someone who wants AI in their editor and doesn't want to think about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JetBrains AI Assistant + Junie&lt;/strong&gt; is the equivalent for the JetBrains crowd. 11% adoption combined. If you live in IntelliJ, PyCharm, or WebStorm, it's the natural fit because it understands JetBrains' code intelligence in ways Copilot doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabnine&lt;/strong&gt; still exists and still gets recommended for teams that need on-prem or air-gapped deployment. Outside that niche, it's been overtaken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continue.dev&lt;/strong&gt; is the open-source Copilot-shaped option. Lives inside VS Code or JetBrains as an extension, brings your own API key, 31K GitHub stars. Less polished than Copilot, but you're not on a per-seat license and you choose your model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2: AI-native IDEs (the editor itself is the product)
&lt;/h3&gt;

&lt;p&gt;These are full editor replacements where the AI is woven into every keystroke, not bolted on as an extension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; is the reference. A VS Code fork that took "AI in the editor" further than anyone else. Composer mode handles multi-file edits with visual diffs, autocomplete is supernaturally fast (Supermaven under the hood), and the agent can take on actual tasks. It's the most productive IDE-based AI experience right now, with one giant asterisk: pricing trust took a hit earlier in 2026 when Anthropic's pricing changes cascaded through Cursor's billing model and a lot of people got surprise bills. The product is still excellent. The pricing is the part you have to watch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windsurf&lt;/strong&gt; is the value alternative. Same category as Cursor, $15/month base, free tier with full IDE features and the Cascade agent. It's been climbing the rankings precisely because it's what Cursor was before the pricing got messy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt; is Google's entry, launched November 2025. Free during preview. Supports Claude, Gemini, GPT-OSS — the most diverse model lineup of any free tool right now. 6% adoption already, which is fast for a tool this new.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3: Terminal agents (the new center of gravity)
&lt;/h3&gt;

&lt;p&gt;This is where serious work is happening in 2026. You point an agent at your repo from the terminal, and it reads, edits, runs tests, iterates. The terminal-first approach composes with everything: git, your shell, your CI, your existing scripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; is the one I use daily and the one most experienced developers have settled on. Anthropic's official terminal agent, runs Opus and Sonnet, scores 80.8% on SWE-bench Verified — meaning it actually solves real GitHub issues, not toy problems. It's the best at multi-file reasoning and the best at not losing context on hour three of a complex task. Costs $20/month for Pro, but heavy use can run $100–200/month on the Max plan or via API. That's the elephant in the room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI Codex CLI&lt;/strong&gt; re-entered the conversation in early 2026 with parallel sandboxed execution and automatic PR creation. 3% adoption (data from before its desktop app launched), but climbing. Strong choice if you're already in the OpenAI ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini CLI&lt;/strong&gt; is the underrated one. Google's terminal agent. 1,000 free requests/day with Gemini 2.5 Pro and a 1M context window. Less consistent than Claude on complex refactors, but for the price (zero) and the context size (massive), it's the best free terminal option right now. Don't skip it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aider&lt;/strong&gt; is the elder statesman. 41K GitHub stars, terminal-first, and its defining feature is that every AI edit is a git commit. You get a complete audit trail of what the AI changed and why. Bring your own API key. If you live in git, this is the one to try first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenCode&lt;/strong&gt; is the most popular open-source terminal agent. 95K stars. Provider-agnostic — supports 75+ models. Free models included, plus you can plug in any API key. Cleaner TUI than Aider, less opinionated about git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cline&lt;/strong&gt; (58K stars) and its forks &lt;strong&gt;Roo Code&lt;/strong&gt; (22K) and &lt;strong&gt;Kilo Code&lt;/strong&gt; (16K) live as VS Code extensions but operate as full agents — they edit files, run commands, and ask for approval at each step. BYOK with zero markup. If you want Cursor-style agentic work but inside vanilla VS Code without the subscription, this is the path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 4: Cloud agents (autonomous, parallel, expensive)
&lt;/h3&gt;

&lt;p&gt;These run in the cloud, often handling multiple tasks in parallel sandboxes, opening PRs against your repo while you do something else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Devin&lt;/strong&gt; is the original autonomous agent. 67% PR merge rate on well-defined tasks. Treats coding tasks like Jira tickets it picks up and ships. $20/month base plus unpredictable per-task costs. Useful as an accelerator for narrow, well-scoped work; treat anything it ships as a draft.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex (cloud version)&lt;/strong&gt; is OpenAI's hosted agent that runs in sandboxed environments and pushes PRs to GitHub. Strong if your stack is OpenAI-aligned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenHands&lt;/strong&gt; (formerly OpenDevin) is the open-source version of this category. 68K stars, MIT-licensed, BYOK. If you want a cloud-style autonomous agent without the SaaS dependency, this is it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 5: Specialized tools (the rest)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Replit&lt;/strong&gt; still owns the "build an app from a prompt in your browser" niche, especially for prototyping and education. Costs accumulate fast at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bolt.new&lt;/strong&gt; and &lt;strong&gt;Lovable.dev&lt;/strong&gt; are similar — browser-based, AI-first, great for MVPs and demos. Lovable couples to Supabase tightly, which is convenient until you outgrow it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v0&lt;/strong&gt; (Vercel) generates React components from prompts or Figma designs. Useful for design-to-code, less so for general work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabby&lt;/strong&gt; is self-hosted autocomplete you run on your own GPU. The privacy-first option for teams that can't send code to anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snyk Code&lt;/strong&gt; and &lt;strong&gt;Qodo&lt;/strong&gt; sit alongside the rest of the stack — security scanning and AI code review on PRs. Not coding tools strictly, but they're part of the modern AI workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Top 5 paid tools that actually justify their price
&lt;/h2&gt;

&lt;p&gt;I'm ranking these on a single criterion: would I be measurably less productive without them. Not "is the demo impressive." Not "did they raise a Series B." Would my output drop if I uninstalled it tomorrow.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Claude Code — $20–200/month
&lt;/h3&gt;

&lt;p&gt;Best for: complex multi-file work, anything where the model losing context costs you an hour of cleanup.&lt;/p&gt;

&lt;p&gt;Claude Code on Opus is the only tool I trust with a refactor that touches more than three files. It plans, executes, runs my tests, and recovers from its own mistakes. The 200K context window plus extended thinking actually changes how I architect things — I can describe a problem at a higher level than I used to.&lt;/p&gt;

&lt;p&gt;The price is real. Heavy use can run $100–200/month on Max. The honest framing is: if you're a working developer billing for your time, $200/month for the tool that saves you a few hours a week is the cheapest line item on your invoice. If you're a hobbyist, this isn't the right tier.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cursor — from $20/month
&lt;/h3&gt;

&lt;p&gt;Best for: developers who think visually and want diffs they can scan instead of accept.&lt;/p&gt;

&lt;p&gt;If you do most of your work in an editor and the terminal-first model doesn't fit your brain, Cursor is the most productive AI IDE in existence. Composer mode for multi-file changes, instant autocomplete, model orchestration. The pricing trust issue I mentioned is real — monitor your credits, especially if you flip into agent mode for big tasks. With that caveat, it earns its place here.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GitHub Copilot — $10/month
&lt;/h3&gt;

&lt;p&gt;Best for: the developer who wants AI in their editor and wants to never think about it again.&lt;/p&gt;

&lt;p&gt;Copilot earned its place not by being the best, but by being the floor. $10/month, works everywhere, never surprises you with a bill, integrates with the GitHub ecosystem (PR summaries, issue context, repo activity). It's the silent default. Stop overthinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Windsurf — from $15/month
&lt;/h3&gt;

&lt;p&gt;Best for: people who want what Cursor was before the pricing drama.&lt;/p&gt;

&lt;p&gt;Windsurf does what Cursor does, charges less, and the free tier is genuinely usable for daily work. Cascade agent, plan mode, parallel multi-agent sessions with git worktrees. It's the IDE I'd recommend to someone starting from scratch in 2026 if cost predictability matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Devin — $20/month + variable
&lt;/h3&gt;

&lt;p&gt;Best for: well-scoped, repetitive tasks you can describe in a paragraph.&lt;/p&gt;

&lt;p&gt;Devin shipping a 67% PR merge rate on defined tasks is the data point that matters. It's not autonomy in the science-fiction sense — it's a junior engineer who works on tickets in parallel sandboxes and submits drafts. For the right kind of work (boring but real: dependency upgrades, test coverage, scoped refactors) it earns its keep. For ambiguous work, you'll spend more time correcting it than you save.&lt;/p&gt;




&lt;h2&gt;
  
  
  Top 5 free tools that genuinely replace a paid one
&lt;/h2&gt;

&lt;p&gt;The bar here: would I recommend this to someone who can't or won't pay, knowing they'll get within 80% of the paid experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Gemini CLI — free (1,000 requests/day)
&lt;/h3&gt;

&lt;p&gt;Best free terminal agent in 2026, full stop. Gemini 2.5 Pro, 1M context window, runs in your terminal, BYOK with a generous free tier from Google. It's not as consistent as Claude Code on the hardest tasks, but for 90% of work, the gap doesn't matter. And the 1M context window means it can ingest a small codebase in a single prompt — something even paid Claude Code can't always match.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Aider — free (BYOK)
&lt;/h3&gt;

&lt;p&gt;Best for terminal-native, git-centric work. Pair it with the DeepSeek API and you're paying $5–15/month total for AI coding that competes with $200/month tools. Every edit is a git commit. Reviewable, revertible, auditable. If you've ever lost track of what an agent changed across a session, Aider's commit history is the answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cline — free (BYOK, runs in VS Code)
&lt;/h3&gt;

&lt;p&gt;Best free agent inside an IDE. 5M+ installs, Apache-licensed, every action requires human approval. Plug in your Claude or OpenAI key and you have Cursor's agent capability inside vanilla VS Code without the subscription. The forks (Roo Code, Kilo Code) add structured modes and broader model support — pick whichever feels right; they're all good.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. GitHub Copilot Free — free (2,000 completions + 50 chats/month)
&lt;/h3&gt;

&lt;p&gt;The free tier of Copilot is real and surprisingly generous for casual or learning use. If you're not coding 8 hours a day, the free quota covers it. The path most people should take: start here, find your edges, then decide whether to pay or move to BYOK.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. OpenCode — free (BYOK, free models included)
&lt;/h3&gt;

&lt;p&gt;The open-source terminal agent that's quietly become the most popular on GitHub (95K stars). Ships with free models you can use immediately, supports 75+ providers when you bring keys, polished TUI. If you want to try terminal agents without making any decisions about API keys or pricing on day one, OpenCode is the lowest-friction starting point.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually run
&lt;/h2&gt;

&lt;p&gt;For full transparency, since I think it matters more than abstract rankings: I use Claude Code on Max for the heavy lifting, Cline in VS Code for in-editor work where I want approval gates, and Gemini CLI for anything where I want to throw a huge codebase at a model in one prompt. Three tools, three roles, no overlap.&lt;/p&gt;

&lt;p&gt;That's the meta-point. In 2026, the question is no longer "which is the best AI coding tool." It's "which combination handles each layer of my workflow without breaking under pressure." Get that right and the cost question answers itself — because the right setup pays for itself in saved hours, and the wrong setup torches credits without shipping anything.&lt;/p&gt;

&lt;p&gt;If your current setup is one tool doing everything, you're probably either overpaying for capability you don't use or underpowered for the work you actually do. Pick the layer that hurts most and start there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What does your stack look like? Curious especially about people running fully BYOK setups — what's the monthly bill landing at versus the equivalent SaaS subscriptions?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Quadlet: The Podman Feature That Finally Makes Sense on a Homelab</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Thu, 23 Apr 2026 08:45:09 +0000</pubDate>
      <link>https://dev.to/alvarito1983/quadlet-the-podman-feature-that-finally-makes-sense-on-a-homelab-2m3</link>
      <guid>https://dev.to/alvarito1983/quadlet-the-podman-feature-that-finally-makes-sense-on-a-homelab-2m3</guid>
      <description>&lt;p&gt;If you run a homelab on Docker Compose, you've probably accepted a quiet trade-off without noticing.&lt;/p&gt;

&lt;p&gt;Your containers work. They start on boot. They restart if they crash. But they live &lt;em&gt;outside&lt;/em&gt; the operating system's service model — orphaned from systemd, invisible to &lt;code&gt;journalctl&lt;/code&gt;, dependent on a daemon that has to be alive before anything else in your stack can exist. Your 40 services are really 40 children of a single PID, not 40 first-class citizens of your Linux host.&lt;/p&gt;

&lt;p&gt;This isn't a problem, exactly. It's just a ceiling. And over the last year a feature from the Podman side of the container world has quietly raised that ceiling in a way that's interesting enough to write about — even if you, like me, have zero intention of ripping out your Docker Compose setup tomorrow.&lt;/p&gt;

&lt;p&gt;The feature is called &lt;strong&gt;Quadlet&lt;/strong&gt;. It has been around since Podman 4.4, but 2026 is the year it's actually becoming the default way sysadmins on Red Hat-adjacent systems manage containers at home. And it does something I've not seen any other container tool do cleanly: it makes a container behave like a native systemd service.&lt;/p&gt;

&lt;p&gt;Let's look at what that actually means, what it's good for, and — importantly — when you should probably ignore it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Quadlet actually is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;Quadlet is a systemd generator that reads declarative &lt;code&gt;.container&lt;/code&gt; files (plus &lt;code&gt;.network&lt;/code&gt;, &lt;code&gt;.volume&lt;/code&gt;, &lt;code&gt;.pod&lt;/code&gt;, &lt;code&gt;.kube&lt;/code&gt;, &lt;code&gt;.image&lt;/code&gt; and a few others) and converts them at boot time into real systemd service units. You don't run &lt;code&gt;podman run&lt;/code&gt; and you don't write unit files by hand. You drop an INI-style file into a specific directory, run &lt;code&gt;systemctl daemon-reload&lt;/code&gt;, and now you have a fully managed service with restart policies, dependency management, journal logging, healthchecks, and optional auto-updates — all driven by systemd, not by a background daemon.&lt;/p&gt;

&lt;p&gt;That's the whole idea. The container is no longer something Podman runs &lt;em&gt;on the side&lt;/em&gt;. It's something your operating system runs, the same way it runs &lt;code&gt;sshd&lt;/code&gt; or &lt;code&gt;nginx&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The simplest possible example
&lt;/h2&gt;

&lt;p&gt;A minimal rootless Quadlet for something useful — let's say Vaultwarden — looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# ~/.config/containers/systemd/vaultwarden.container
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Vaultwarden password vault&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;

&lt;span class="nn"&gt;[Container]&lt;/span&gt;
&lt;span class="py"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;docker.io/vaultwarden/server:latest&lt;/span&gt;
&lt;span class="py"&gt;ContainerName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vaultwarden&lt;/span&gt;
&lt;span class="py"&gt;PublishPort&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8080:80&lt;/span&gt;
&lt;span class="py"&gt;Volume&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vaultwarden-data.volume:/data&lt;/span&gt;
&lt;span class="py"&gt;AutoUpdate&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;registry&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;TimeoutStartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;300&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;default.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload
systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; start vaultwarden.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. There's no &lt;code&gt;vaultwarden.service&lt;/code&gt; file on disk — Quadlet generates it on the fly. If you edit the &lt;code&gt;.container&lt;/code&gt; file and reload, the generated unit updates. If a newer Podman version ships improvements to the generator, your service picks them up next reboot without you touching anything.&lt;/p&gt;

&lt;p&gt;The volume referenced as &lt;code&gt;vaultwarden-data.volume&lt;/code&gt; is another Quadlet file (a &lt;code&gt;.volume&lt;/code&gt;), which generates a named volume managed by systemd the same way.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you actually gain
&lt;/h2&gt;

&lt;p&gt;This is the part that took me a while to appreciate. It's not "Podman has replaced Docker." It's that &lt;strong&gt;the integration layer is fundamentally different.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unified logging.&lt;/strong&gt; &lt;code&gt;journalctl --user -u vaultwarden.service&lt;/code&gt; gives you the container's logs in the same place and same format as the rest of the system. No &lt;code&gt;docker logs&lt;/code&gt;, no parallel logging story. When something breaks at 2am, you're searching one place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real dependency management.&lt;/strong&gt; Want your Nextcloud container to only start after MariaDB is ready &lt;em&gt;and&lt;/em&gt; network-online.target has fired? Write it in the &lt;code&gt;[Unit]&lt;/code&gt; section like any other service. systemd handles the ordering, not a &lt;code&gt;depends_on&lt;/code&gt; line that only waits for process start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Restart policies and health-triggered recovery.&lt;/strong&gt; Quadlet exposes &lt;code&gt;HealthCmd&lt;/code&gt;, &lt;code&gt;HealthInterval&lt;/code&gt;, &lt;code&gt;HealthOnFailure&lt;/code&gt;, &lt;code&gt;HealthRetries&lt;/code&gt; directly. Combined with &lt;code&gt;HealthOnFailure=kill&lt;/code&gt; and systemd's &lt;code&gt;Restart=always&lt;/code&gt;, you get a self-healing service loop that doesn't depend on anything watching from outside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-update with automatic rollback.&lt;/strong&gt; Add &lt;code&gt;AutoUpdate=registry&lt;/code&gt; and the &lt;code&gt;podman-auto-update.timer&lt;/code&gt; checks daily for new image digests. If the new image fails the healthcheck after restart, Podman rolls back to the previous image automatically. No Watchtower, no cron hack, no custom script — and crucially, no blind &lt;code&gt;latest&lt;/code&gt; tag chasing that silently deploys a broken image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rootless by default.&lt;/strong&gt; The file above runs under your user account. A container breakout gets your UID, not root. For a homelab exposing services, this is a meaningful reduction in blast radius.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No daemon to keep alive.&lt;/strong&gt; There's no &lt;code&gt;dockerd&lt;/code&gt; that has to be up before your stack exists. Containers are direct children of systemd. If Podman itself has a bug tomorrow, the contract with your services is still "this is a systemd unit" — same tools, same lifecycle, same recovery procedures you already know.&lt;/p&gt;




&lt;h2&gt;
  
  
  The comparison that matters: Quadlet vs Docker Compose
&lt;/h2&gt;

&lt;p&gt;I want to be honest here because most of what's written online about Podman/Quadlet treats Docker Compose as the enemy. It isn't. Compose and Quadlet solve overlapping problems with very different philosophies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Compose thinks in stacks.&lt;/strong&gt; One &lt;code&gt;docker-compose.yml&lt;/code&gt; describes a self-contained application: services, networks, volumes, dependencies, all in one file. You &lt;code&gt;docker compose up -d&lt;/code&gt; and the stack exists. It's portable across any machine with Docker. You can commit it to a git repo and anyone can reproduce your environment. The mental model is: &lt;em&gt;an application is a folder&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quadlet thinks in system services.&lt;/strong&gt; Each container is its own unit file. Networks and volumes are their own unit files. The relationships are expressed through systemd's dependency graph, not through a single manifest. The mental model is: &lt;em&gt;a container is a service that happens to run in a container&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For development, portability, and throwaway environments, Compose wins. It's simpler, the tooling is mature, and the ecosystem is vast. For a long-lived single-host deployment where you want containers to behave like every other service on your Linux box, Quadlet wins.&lt;/p&gt;

&lt;p&gt;The honest answer for most homelabbers is that &lt;strong&gt;both are valid&lt;/strong&gt;, and which one fits depends on what you actually value.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Quadlet is the wrong answer
&lt;/h2&gt;

&lt;p&gt;Skip this feature if any of the following apply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your homelab runs on Windows / WSL2 / macOS.&lt;/strong&gt; Quadlet is Linux + systemd. Period. If you're on Docker Desktop, this isn't for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're deeply invested in Compose-specific features&lt;/strong&gt; like &lt;code&gt;profiles&lt;/code&gt;, &lt;code&gt;extends&lt;/code&gt;, &lt;code&gt;x-*&lt;/code&gt; anchors, or the Compose CLI's build workflows. &lt;code&gt;podman-compose&lt;/code&gt; exists but compatibility isn't 100%, and Quadlet isn't trying to replicate Compose semantics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You want GUI-first management.&lt;/strong&gt; Portainer, Dockge, and the like are built around Docker. Cockpit has Quadlet integration now, but the ecosystem is thinner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You share stacks across machines with non-Linux users.&lt;/strong&gt; Compose files are more portable as artifacts than a folder of &lt;code&gt;.container&lt;/code&gt; units tied to one host's systemd tree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU passthrough for media transcoding is a hard requirement and you have it working on Docker.&lt;/strong&gt; It's doable on Podman, but expect extra work. If your Jellyfin is happy today, don't break it for philosophy.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When Quadlet is genuinely the right answer
&lt;/h2&gt;

&lt;p&gt;Reach for it when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You run a Linux-native homelab&lt;/strong&gt; on Fedora, Rocky, Alma, CentOS Stream, Debian, or openSUSE and your containers are long-lived services rather than dev environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You care about boot ordering.&lt;/strong&gt; "Start reverse proxy after databases after network is up" is a one-liner in systemd, and a fragile convention in Compose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You want auto-update with rollback&lt;/strong&gt; without bolting on a third-party tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're tired of the Docker daemon being a single point of failure&lt;/strong&gt; for your entire container story.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're already comfortable with systemd&lt;/strong&gt; as an operator. This is the key one. If &lt;code&gt;systemctl&lt;/code&gt;, &lt;code&gt;journalctl&lt;/code&gt;, and unit file syntax feel natural to you, Quadlet is going to feel like containers finally speaking your language. If they don't, the learning curve is real and not worth it for a Plex install.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The hybrid setup that actually makes sense
&lt;/h2&gt;

&lt;p&gt;This is where I've landed, and I think it's where most practical people will land:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose for development and prototyping.&lt;/strong&gt; Fast iteration, familiar tooling, easy to share. If I'm testing a new self-hosted tool for the first time, it's going into a Compose file in a scratch directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quadlet for the services I've committed to.&lt;/strong&gt; Once something graduates from "I'm trying this out" to "this runs my household," it's worth the 15 minutes to port it to a &lt;code&gt;.container&lt;/code&gt; file and let systemd own its lifecycle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't have to pick one. On a Linux homelab you can run both side by side. The Docker daemon and Podman's rootless stack don't fight each other — they just don't talk.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest closing thought
&lt;/h2&gt;

&lt;p&gt;Quadlet isn't going to replace Docker Compose in most homelabs, and I don't think it should. Compose is good at what Compose is good for. What Quadlet does is close a gap I didn't realize I had: my containers were never really part of my operating system. They were tenants. With Quadlet, for the services where it matters, they become residents.&lt;/p&gt;

&lt;p&gt;That's a small distinction until it isn't — until the night something breaks and you realize your recovery story is the same one you use for every other service on the box, instead of a separate container-shaped exception.&lt;/p&gt;

&lt;p&gt;If you run Linux and you've been curious about Podman but couldn't articulate what the actual upgrade was, this is it. Not the daemon thing. Not the rootless thing in isolation. The integration.&lt;/p&gt;

&lt;p&gt;Try it on one service. See how it feels. If it clicks, you'll know. If it doesn't, your Compose file is still there, and nothing has been lost.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you moved any part of your stack to Quadlet, or tried and bounced off it? I'd like to hear which services worked cleanly and which were more trouble than they were worth — drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>podman</category>
      <category>linux</category>
      <category>selfhosted</category>
      <category>homelab</category>
    </item>
    <item>
      <title>The WSL2 Guide I Wish I Had: 4 Gotchas That Will Eat Your Afternoon</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:38:57 +0000</pubDate>
      <link>https://dev.to/alvarito1983/the-wsl2-guide-i-wish-i-had-4-gotchas-that-will-eat-your-afternoon-5aal</link>
      <guid>https://dev.to/alvarito1983/the-wsl2-guide-i-wish-i-had-4-gotchas-that-will-eat-your-afternoon-5aal</guid>
      <description>&lt;p&gt;WSL2 is a fantastic development environment on Windows. It's also a system with sharp edges that the official docs rarely highlight — the kind you only discover after losing an afternoon to a process eating 300% CPU for no apparent reason.&lt;/p&gt;

&lt;p&gt;This guide documents four specific problems I've hit repeatedly over the last year while using WSL2 as my main development environment for Docker-based projects. For each one: the root cause, why the obvious fix doesn't work, and what actually solves it.&lt;/p&gt;

&lt;p&gt;This isn't an introduction to WSL2. If you're already using it daily and something feels off, keep reading.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Docker Desktop, cgroups, and processes that ignore resource limits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The symptom
&lt;/h3&gt;

&lt;p&gt;You run a container on Docker Desktop for Windows (which uses WSL2 under the hood). The container executes a CPU-intensive process — a vulnerability scanner, a compiler, a batch job.&lt;/p&gt;

&lt;p&gt;You watch &lt;code&gt;htop&lt;/code&gt; and the process is consuming &lt;strong&gt;300%+ CPU&lt;/strong&gt;, dragging the entire system down.&lt;/p&gt;

&lt;p&gt;You think: &lt;em&gt;"no problem, I'll throttle it."&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;heavy-worker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-scanner:latest&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1.0'&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1G&lt;/span&gt;
    &lt;span class="na"&gt;cpu_count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You restart the container.&lt;/p&gt;

&lt;p&gt;Still 300% CPU.&lt;/p&gt;

&lt;p&gt;You try &lt;code&gt;nice&lt;/code&gt;, &lt;code&gt;ionice&lt;/code&gt;, &lt;code&gt;cpulimit&lt;/code&gt;... nothing works.&lt;/p&gt;

&lt;h3&gt;
  
  
  The root cause
&lt;/h3&gt;

&lt;p&gt;Docker Desktop runs containers inside a WSL2-hosted VM using &lt;strong&gt;cgroup v2&lt;/strong&gt;, often with limited controllers.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;deploy.resources.limits&lt;/code&gt; → ignored&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cpu_count&lt;/code&gt; → ignored&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nice&lt;/code&gt; / &lt;code&gt;ionice&lt;/code&gt; → ineffective&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/cgroup.controllers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll often see fewer controllers than on a native Linux system.&lt;/p&gt;

&lt;h3&gt;
  
  
  What actually works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Option A (best): Limit the WSL2 VM&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[wsl2]&lt;/span&gt;
&lt;span class="py"&gt;processors&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;
&lt;span class="py"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8GB&lt;/span&gt;
&lt;span class="py"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2GB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--shutdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the VM is capped → containers behave predictably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B: Use tool-level throttling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Examples:&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="nt"&gt;--parallel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nt"&gt;--low-mem&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These bypass scheduler issues entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option C: Replace the tool&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If it's designed to max all cores and can't be tuned → wrong tool for WSL2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key takeaway
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't trust container limits on WSL2. Control the VM or use self-throttling tools.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Disk performance: &lt;code&gt;/mnt/c&lt;/code&gt; vs native WSL filesystem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The symptom
&lt;/h3&gt;

&lt;p&gt;Working in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/mnt/c/Users/you/projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt; → 8 minutes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git status&lt;/code&gt; → 4 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Move to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt; → 25 seconds&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git status&lt;/code&gt; → instant&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The root cause
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/mnt/c&lt;/code&gt; uses the &lt;strong&gt;9P protocol&lt;/strong&gt; → every filesystem call crosses the Windows ↔ Linux boundary.&lt;/p&gt;

&lt;p&gt;Heavy IO workloads (Node, Git, Docker builds) get destroyed by latency.&lt;/p&gt;

&lt;p&gt;Native WSL FS = ext4 inside VHDX → near-native Linux speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real benchmark
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;&lt;code&gt;/mnt/c&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;WSL native&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~8 min&lt;/td&gt;
&lt;td&gt;~25 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;git status&lt;/code&gt; (10k files)&lt;/td&gt;
&lt;td&gt;~4 sec&lt;/td&gt;
&lt;td&gt;&amp;lt; 100 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;docker build&lt;/code&gt; context&lt;/td&gt;
&lt;td&gt;~90 sec&lt;/td&gt;
&lt;td&gt;~3 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What actually works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; keep code inside WSL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/projects/myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code + WSL extension ✅ (best)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\\wsl$\Ubuntu\home\you\projects&lt;/code&gt; (OK)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you MUST use &lt;code&gt;/mnt/c&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move heavy dirs (&lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;.git&lt;/code&gt;) to WSL&lt;/li&gt;
&lt;li&gt;Use symlinks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key takeaway
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;/mnt/c&lt;/code&gt; is for compatibility, not performance.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Networking: ports, shifting IPs, and host access
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The symptom
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;localhost:3000&lt;/code&gt; → sometimes works, sometimes not&lt;/li&gt;
&lt;li&gt;WSL IP changes every reboot&lt;/li&gt;
&lt;li&gt;LAN access → broken&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The root cause
&lt;/h3&gt;

&lt;p&gt;WSL2 networking is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NATed via Hyper-V&lt;/li&gt;
&lt;li&gt;Not bridged&lt;/li&gt;
&lt;li&gt;Dynamic IP&lt;/li&gt;
&lt;li&gt;Partial &lt;code&gt;localhost&lt;/code&gt; forwarding&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What actually works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ensure localhost forwarding:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[wsl2]&lt;/span&gt;
&lt;span class="py"&gt;localhostForwarding&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Get WSL IP:&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;ip addr show eth0 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'inet '&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;/ &lt;span class="nt"&gt;-f1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expose to LAN (port proxy):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$wslIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' '&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;span class="w"&gt;

&lt;/span&gt;&lt;span class="nx"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portproxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;v4tov4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;listenaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;connectport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;connectaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$wslIP&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;New-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WSL 3000"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inbound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Allow&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;Best solution (modern WSL):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[wsl2]&lt;/span&gt;
&lt;span class="py"&gt;networkingMode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;mirrored&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;✔ Same network as host&lt;/li&gt;
&lt;li&gt;✔ No NAT issues&lt;/li&gt;
&lt;li&gt;✔ LAN works directly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key takeaway
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;WSL2 networking = NAT. Use mirrored mode if available.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Memory: the &lt;code&gt;vmmem&lt;/code&gt; problem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The symptom
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start day → 4 GB used&lt;/li&gt;
&lt;li&gt;Work with Docker&lt;/li&gt;
&lt;li&gt;Stop everything&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vmmem&lt;/code&gt; still using 12 GB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never released.&lt;/p&gt;

&lt;h3&gt;
  
  
  The root cause
&lt;/h3&gt;

&lt;p&gt;WSL2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allocates memory dynamically&lt;/li&gt;
&lt;li&gt;Does not release it back&lt;/li&gt;
&lt;li&gt;Linux keeps cache (normal behavior)&lt;/li&gt;
&lt;li&gt;Windows cannot reclaim it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What actually works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cap memory:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[wsl2]&lt;/span&gt;
&lt;span class="py"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8GB&lt;/span&gt;
&lt;span class="py"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4GB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Enable auto reclaim:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[experimental]&lt;/span&gt;
&lt;span class="py"&gt;autoMemoryReclaim&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;gradual&lt;/span&gt;
&lt;span class="py"&gt;sparseVhd&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Manual reclaim:&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="nb"&gt;sudo &lt;/span&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"echo 3 &amp;gt; /proc/sys/vm/drop_caches"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Last resort:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--shutdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key takeaway
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;WSL will NOT give memory back unless you force it or configure it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Minimal &lt;code&gt;.wslconfig&lt;/code&gt; (recommended)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[wsl2]&lt;/span&gt;
&lt;span class="py"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8GB&lt;/span&gt;
&lt;span class="py"&gt;processors&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;
&lt;span class="py"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2GB&lt;/span&gt;

&lt;span class="py"&gt;localhostForwarding&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;networkingMode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;mirrored&lt;/span&gt;

&lt;span class="nn"&gt;[experimental]&lt;/span&gt;
&lt;span class="py"&gt;autoMemoryReclaim&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;gradual&lt;/span&gt;
&lt;span class="py"&gt;sparseVhd&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📍 &lt;strong&gt;Path:&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;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;you&amp;gt;&lt;span class="se"&gt;\.&lt;/span&gt;wslconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--shutdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;Most of these issues come from one fact:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;WSL2 is a VM pretending to be native Linux.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the cracks show when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You push CPU&lt;/li&gt;
&lt;li&gt;You do heavy IO&lt;/li&gt;
&lt;li&gt;You rely on networking assumptions&lt;/li&gt;
&lt;li&gt;You expect Linux memory behavior to match Windows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WSL2 is still excellent — but only if you understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cgroups quirks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/mnt/c&lt;/code&gt; performance trap&lt;/li&gt;
&lt;li&gt;NAT networking&lt;/li&gt;
&lt;li&gt;Memory ballooning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you do, most "random issues" become predictable.&lt;/p&gt;




&lt;p&gt;If you've hit other WSL2 gotchas, drop them in the comments 👇&lt;/p&gt;

&lt;p&gt;The one that surprised me most? Spending 3 days tuning container limits… that were being completely ignored.&lt;/p&gt;

&lt;p&gt;💡 &lt;em&gt;Did this save you an afternoon? A follow or reaction helps me write more of these.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wsl2</category>
      <category>docker</category>
      <category>devops</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Everyone is using Claude Code wrong.</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Mon, 20 Apr 2026 14:17:15 +0000</pubDate>
      <link>https://dev.to/alvarito1983/everyone-is-using-claude-code-wrong-1i26</link>
      <guid>https://dev.to/alvarito1983/everyone-is-using-claude-code-wrong-1i26</guid>
      <description>&lt;p&gt;Not because they're bad developers. Because the mental model is wrong from the start.&lt;/p&gt;

&lt;p&gt;Most people open Claude Code and treat it like a smarter autocomplete. They ask it to write a function. Fix a bug. Generate a component. Then they wonder why the output needs so much correction, why the context gets lost after a few sessions, why it feels like babysitting rather than collaborating.&lt;/p&gt;

&lt;p&gt;The problem isn't Claude Code. It's the job description you gave it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The wrong mental model
&lt;/h2&gt;

&lt;p&gt;When you use Claude Code as a coding assistant, you're asking it to be a fast typist. It writes code, you review it, you correct it, you move on.&lt;/p&gt;

&lt;p&gt;That works. It's faster than writing everything yourself. But it's not where the leverage is.&lt;/p&gt;

&lt;p&gt;The leverage is in treating Claude Code as a contractor, not a typist. A contractor who can execute an entire feature end-to-end — backend, frontend, tests, documentation — if you give them the right briefing.&lt;/p&gt;

&lt;p&gt;The difference between a typist and a contractor isn't skill. It's context.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Claude Code actually needs
&lt;/h2&gt;

&lt;p&gt;Claude Code has no persistent memory between sessions. Every time you start a new conversation, it starts completely fresh. It doesn't know your architecture decisions, your naming conventions, your known bugs, or where you left off last time.&lt;/p&gt;

&lt;p&gt;Most people solve this by re-explaining everything at the start of each session. That's the wrong solution. It's slow, it's incomplete, and you always forget something important.&lt;/p&gt;

&lt;p&gt;The right solution is a single file that does the re-explaining for you.&lt;/p&gt;

&lt;p&gt;I call it CLAUDE.md. It lives at the root of every project. Claude Code reads it automatically at the start of every session.&lt;/p&gt;

&lt;p&gt;It has four sections:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current State&lt;/strong&gt; — what's working, what's broken, where to pick up. Updated at the end of every session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture Decisions&lt;/strong&gt; — not what you built, but why. "We use in-memory sessions because adding a persistence layer would complicate the Docker setup for homelab users." The reasoning that would otherwise live only in your head.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conventions&lt;/strong&gt; — specific rules Claude Code must follow. Not "write clean code." That's useless. Instead: exact patterns learned from real debugging sessions. Things that would take 30 minutes to rediscover without documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Known Issues&lt;/strong&gt; — bugs and limitations that are known but not yet fixed. Prevents Claude Code from "fixing" something intentionally left as-is.&lt;/p&gt;

&lt;p&gt;Without this file, every session starts at zero. With it, Claude Code picks up exactly where you left off.&lt;/p&gt;




&lt;h2&gt;
  
  
  The second mistake: one task at a time
&lt;/h2&gt;

&lt;p&gt;Most people use Claude Code sequentially. Finish one thing, start the next.&lt;/p&gt;

&lt;p&gt;Claude Code supports sub-agents — multiple parallel workstreams running simultaneously. If you need to build five related components, you don't have to build them one by one.&lt;/p&gt;

&lt;p&gt;The mental shift is from "what's the next task" to "what can run in parallel." A frontend and a backend for the same feature. Unit tests while the implementation is being written. Documentation while the code is being reviewed.&lt;/p&gt;

&lt;p&gt;This is where the output multiplier kicks in. Not 2x faster — closer to 5x, because the bottleneck is no longer Claude Code's speed. It's your ability to architect work that can run in parallel.&lt;/p&gt;




&lt;h2&gt;
  
  
  The third mistake: no standards document
&lt;/h2&gt;

&lt;p&gt;When you use Claude Code across multiple sessions or multiple parts of a project, consistency breaks down fast. The button style from session one doesn't match session three. The error handling pattern in one module contradicts another.&lt;/p&gt;

&lt;p&gt;The fix is a standards document in CLAUDE.md. Not a style guide for humans — a set of rules Claude Code must follow exactly, every time, without being reminded.&lt;/p&gt;

&lt;p&gt;Color values. Component patterns. API response shapes. Auth flows. Every decision that should be consistent across the codebase, written down once, enforced automatically.&lt;/p&gt;

&lt;p&gt;Without it, you spend half your time correcting drift. With it, Claude Code enforces your standards better than you would yourself — because it doesn't get tired or forget.&lt;/p&gt;




&lt;h2&gt;
  
  
  The fourth mistake: no forcing function for updates
&lt;/h2&gt;

&lt;p&gt;The obvious weakness of CLAUDE.md is staleness. If you don't update it, it becomes worse than useless — it confidently points Claude Code in the wrong direction.&lt;/p&gt;

&lt;p&gt;Discipline doesn't work. The sessions where you forget to update are exactly the sessions where something important happened.&lt;/p&gt;

&lt;p&gt;The fix is simple: at the end of every session, ask Claude Code to update the Current State section before closing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Before we finish, update the Current State section in CLAUDE.md to reflect what we did today, what's working, and where to pick up next time."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thirty seconds. While the context is still fresh. The model is better at summarizing what just happened than you are at remembering to write it down.&lt;/p&gt;

&lt;p&gt;It catches maybe 80% of sessions. The other 20% are interrupted sessions — closed terminal, crashed IDE, ran out of time. Those you can't fully solve. But 80% is enough to make the system work.&lt;/p&gt;




&lt;h2&gt;
  
  
  What changes when you get this right
&lt;/h2&gt;

&lt;p&gt;The output doesn't feel like AI-assisted coding anymore. It feels like having a contractor who knows your codebase, follows your standards, picks up exactly where you left off, and can work on multiple things at once.&lt;/p&gt;

&lt;p&gt;The work you actually do shifts. Less time writing boilerplate. Less time correcting style drift. Less time re-explaining context. More time on architecture, on product decisions, on the problems that actually require human judgment.&lt;/p&gt;

&lt;p&gt;That's the job description Claude Code was built for. Not typist. Architect's executor.&lt;/p&gt;

&lt;p&gt;Most people never get there because they never give it the right briefing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The CLAUDE.md approach and sub-agent patterns came out of building a 15-tool Docker management platform over several weeks. If you want the specifics on how to structure the file, I wrote about it here: [link to previous article]&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>I let Claude AI decide whether to patch my Docker vulnerabilities — here's what it found</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Sat, 18 Apr 2026 18:02:54 +0000</pubDate>
      <link>https://dev.to/alvarito1983/i-let-claude-ai-decide-whether-to-patch-my-docker-vulnerabilities-heres-what-it-found-4dpf</link>
      <guid>https://dev.to/alvarito1983/i-let-claude-ai-decide-whether-to-patch-my-docker-vulnerabilities-heres-what-it-found-4dpf</guid>
      <description>&lt;p&gt;Every security scanner will tell you what's vulnerable.&lt;/p&gt;

&lt;p&gt;None of them will tell you what to actually do about it.&lt;/p&gt;

&lt;p&gt;You get a list. CVE IDs, severity badges, affected packages. Then you're alone with the question that actually matters: is this exploitable in my setup, can I safely apply the fix, and does patching this break anything?&lt;/p&gt;

&lt;p&gt;I've been building a self-hosted Docker management platform. Last week I wired up an AI layer on top of the vulnerability scanner — not to automate patching, but to automate the reasoning about whether to patch. Here's what happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with "critical"
&lt;/h2&gt;

&lt;p&gt;Critical doesn't mean the same thing in every context.&lt;/p&gt;

&lt;p&gt;CVE-2025-58050 is a critical vulnerability in pcre2. On paper: patch immediately. In practice: it's in a socket proxy image maintained by a third party. I don't control that Dockerfile. I can pull the latest image and hope the maintainer already shipped the fix — or I can wait. Neither option is obvious from the CVE report alone.&lt;/p&gt;

&lt;p&gt;CVE-2026-27143 is a critical vulnerability in Go stdlib. Fix available: upgrade to 1.25.9. Sounds straightforward. The complication: the binary that ships this version of stdlib is cloudflared, Cloudflare's tunnel client. I didn't write it. I can't easily recompile it. The fix depends on Cloudflare publishing an updated release.&lt;/p&gt;

&lt;p&gt;Both are "critical." Neither has the same answer. A scanner can't tell you that. A rule can't tell you that. It requires judgment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Level 1 does
&lt;/h2&gt;

&lt;p&gt;The first layer of automation is rule-based. No AI, no API calls, no external dependencies.&lt;/p&gt;

&lt;p&gt;When a scan completes and finds a critical vulnerability, Level 1 fires an alert. It knows: this image has N critical CVEs, the threshold is 1, therefore alert. Fast, deterministic, always on.&lt;/p&gt;

&lt;p&gt;This covers the obvious cases. A container with a known critical CVE should be flagged. That part doesn't need AI.&lt;/p&gt;

&lt;p&gt;What Level 1 can't do is answer: &lt;em&gt;should I patch this right now, and at what risk?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Level 2 does
&lt;/h2&gt;

&lt;p&gt;When Level 1 detects a critical vulnerability, Level 2 kicks in if an Anthropic API key is configured. It builds a structured prompt with everything the model needs to reason about the situation: the image name, the CVEs, the packages affected, the versions with fixes available, and whether those fixes represent a patch bump, a minor version change, or a major version jump.&lt;/p&gt;

&lt;p&gt;Claude Haiku then returns a structured analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exploitability&lt;/strong&gt; — is this remotely exploitable or does it require local access?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Urgency&lt;/strong&gt; — how quickly does this need to be addressed?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version Risk&lt;/strong&gt; — what's the upgrade risk? Patch bump vs minor vs major?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix Impact&lt;/strong&gt; — is the fix likely to break anything?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommended Action&lt;/strong&gt; — a concrete next step with reasoning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This analysis goes into the notification. The email you receive isn't "critical CVE detected." It's a security brief.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it found on my stack
&lt;/h2&gt;

&lt;p&gt;Three critical vulnerabilities across two images. Here's what the AI analysis said about each:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-27143 and GHSA-p77j-4mvh-x3m3&lt;/strong&gt; — both in a tunnel manager image, both in third-party binaries (Go stdlib and gRPC shipped inside cloudflared). Exploitability: remote. Urgency: critical. Version risk: patch bump. Fix impact: low — &lt;em&gt;but the fix depends on the upstream vendor shipping an updated binary. Recommended action: defer until the vendor publishes an updated release, monitor for new cloudflared versions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2025-58050&lt;/strong&gt; — in a socket proxy image maintained by a third party. Package: pcre2. Fix available: 10.46-r0. Exploitability: remote. Urgency: critical. Fix impact: low. Recommended action: &lt;em&gt;pull the latest image version to pick up the fix if the maintainer has already shipped it. If not, defer and accept the risk with documentation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In both cases the AI correctly identified that I don't control the vulnerable code. It didn't tell me to patch something I can't patch. It told me what I actually needed to know: these are third-party dependencies, here's the risk profile, here's what to do while you wait.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part I didn't expect
&lt;/h2&gt;

&lt;p&gt;The most useful output wasn't the vulnerability analysis. It was the differentiation between "you can fix this" and "you're waiting on someone else."&lt;/p&gt;

&lt;p&gt;That distinction is obvious to a human who investigates the CVE. It's not obvious to a scanner. It requires knowing what the affected binary is, who maintains it, and whether the fix is in your control.&lt;/p&gt;

&lt;p&gt;The AI got this right without me telling it explicitly. It reasoned from the package name and context to the correct conclusion about ownership and fixability.&lt;/p&gt;

&lt;p&gt;That's the gap that rules-based automation can't close. You can write a rule that says "alert on critical CVEs." You can't write a rule that says "if the vulnerable binary is a third-party dependency with no upstream fix available, recommend deferral with documentation."&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned about AI in security workflows
&lt;/h2&gt;

&lt;p&gt;The value isn't automating the patch. It's automating the triage.&lt;/p&gt;

&lt;p&gt;A human security engineer looking at these three CVEs would spend 20-30 minutes researching each one: checking exploitability databases, looking at the upstream project's changelog, assessing version risk, writing up a recommendation. The AI does this in seconds, for every scan, every time.&lt;/p&gt;

&lt;p&gt;The output isn't always perfect. The model can misread version risk or miss context about your specific setup. Every decision is visible in the feed with the full reasoning attached — you can always override, and you should review anything the model flags as critical before acting.&lt;/p&gt;

&lt;p&gt;But the triage is right often enough to dramatically reduce the cognitive load of managing vulnerabilities across a fleet of containers. You stop reading CVE lists and start reading executive summaries with recommended actions.&lt;/p&gt;

&lt;p&gt;That's a different kind of tool.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building this as part of an open source self-hosted Docker management platform. If you're working on similar infrastructure automation problems, drop a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>security</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>CLAUDE.md: the file that makes AI actually remember what you built and why</title>
      <dc:creator>Alvarito1983</dc:creator>
      <pubDate>Fri, 17 Apr 2026 14:51:25 +0000</pubDate>
      <link>https://dev.to/alvarito1983/claudemd-the-file-that-makes-ai-actually-remember-what-you-built-and-why-228d</link>
      <guid>https://dev.to/alvarito1983/claudemd-the-file-that-makes-ai-actually-remember-what-you-built-and-why-228d</guid>
      <description>&lt;p&gt;Every AI coding session starts the same way.&lt;/p&gt;

&lt;p&gt;You open a new chat. You explain the project. You explain the stack. You explain the decisions you made last week and why. You spend 15 minutes giving context before writing a single line of code.&lt;/p&gt;

&lt;p&gt;Then the session ends. The context disappears. Next time, you start over.&lt;/p&gt;

&lt;p&gt;I got tired of this. So I built a system around a single file called CLAUDE.md — and it changed how I work with AI completely.&lt;/p&gt;




&lt;h2&gt;
  
  
  What CLAUDE.md is
&lt;/h2&gt;

&lt;p&gt;It's a plain text file that lives at the root of every project I work on. Claude Code reads it automatically at the start of every session.&lt;/p&gt;

&lt;p&gt;Not a README. Not documentation for other developers. This file is written specifically for the AI — it contains everything the model needs to pick up exactly where we left off without me having to re-explain anything.&lt;/p&gt;

&lt;p&gt;The difference sounds small. It isn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  What goes in it
&lt;/h2&gt;

&lt;p&gt;The file has four sections that I've refined over months of daily use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current State&lt;/strong&gt; is the entry point. It's the first thing Claude Code reads and it answers three questions: what's working, what's broken, and where to pick up next session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Current State — last updated [date]&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; What's working: Hub SSO, all agents, Log Center
&lt;span class="p"&gt;-&lt;/span&gt; What's broken: standalone tool still on old version
&lt;span class="p"&gt;-&lt;/span&gt; Next session: bump versions, publish release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This section gets updated at the end of every session. More on that later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture Decisions&lt;/strong&gt; is where I explain the &lt;em&gt;why&lt;/em&gt;, not the &lt;em&gt;what&lt;/em&gt;. Not "we use JWT auth" but "we use JWT auth with in-memory sessions because adding a persistence layer would complicate the Docker setup for homelab users — revisit when user base grows." The reasoning, the trade-offs, the constraints that shaped the decision.&lt;/p&gt;

&lt;p&gt;This is the section that saves me from re-litigating decisions. When Claude Code suggests something that contradicts a past decision, it sees the reasoning and understands why the alternative was rejected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conventions&lt;/strong&gt; is a list of rules Claude Code must follow. Specific ones, not generic ones. Not "write clean code" — that's useless. Instead: things learned from actual debugging sessions that would take 30 minutes to rediscover. Exact patterns that must be followed. Edge cases that look fixable but aren't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Known Issues&lt;/strong&gt; is a list of bugs and limitations that are known but not yet fixed. This prevents Claude Code from "fixing" something that's intentionally left as-is, or spending time diagnosing something I already understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  The forcing function problem
&lt;/h2&gt;

&lt;p&gt;The obvious weakness: if you don't update the file, it goes stale. And stale context is worse than no context — it confidently points the AI in the wrong direction.&lt;/p&gt;

&lt;p&gt;I tried discipline. It doesn't work reliably. The sessions where you forget to update are exactly the sessions where something important happened — a late-night debugging run, an interrupted session, a decision made in conversation that never touched the codebase.&lt;/p&gt;

&lt;p&gt;The solution I landed on: ask Claude Code to update the Current State block at the end of every session before closing.&lt;/p&gt;

&lt;p&gt;The prompt is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Before we finish, update the Current State section in CLAUDE.md to reflect what we did today, what's working, and where to pick up next time."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It takes 30 seconds. It happens while the context is still fresh. And the model is better at summarizing what just happened than I am at remembering to write it down.&lt;/p&gt;

&lt;p&gt;This catches maybe 80% of sessions that would otherwise leave stale state. The other 20% are interrupted sessions — closed terminal, crashed IDE, ran out of time. Those you can't fully solve. But 80% is enough to make the system work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem it doesn't solve
&lt;/h2&gt;

&lt;p&gt;There's a class of architectural knowledge that CLAUDE.md can't easily capture: the implicit decisions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"We avoid Y because of the incident in March"&lt;/em&gt; is the most important kind of architectural knowledge and the hardest to write down. It's not a pattern — it's a scar. The context that makes it meaningful lives in someone's memory, or in a post-mortem that nobody links to the codebase.&lt;/p&gt;

&lt;p&gt;A model reading CLAUDE.md can only match against what got written. If the decision was implicit — understood by everyone who was there, never documented because it seemed obvious at the time — the model has no surface to match against.&lt;/p&gt;

&lt;p&gt;My partial fix: at the end of sessions I ask Claude Code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Is there anything we decided today that we'd regret not documenting in six months?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It catches some of it. Not all. But it asks in the right direction — not "what did we do" but "what would we wish we'd written down."&lt;/p&gt;




&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;p&gt;I'm building a self-hosted Docker management platform — 13 tools, each with its own frontend, backend, agent, and central Hub integration. The kind of project where losing context between sessions would be catastrophic.&lt;/p&gt;

&lt;p&gt;With CLAUDE.md, a new session starts like this: Claude Code reads the file, understands the current state of all 13 tools, knows the conventions for auth patterns and Docker socket connections and visual standards, and picks up exactly where we left off. No re-explanation. No re-litigating past decisions.&lt;/p&gt;

&lt;p&gt;Today's session: 7 new tools built from scratch, all integrated into the ecosystem, all following the same design system and agent patterns. Claude Code maintained consistency across all of them because the standards were written down, not carried in my head.&lt;/p&gt;

&lt;p&gt;Without CLAUDE.md, that consistency would have required constant correction. With it, the model enforces the standards itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The one-line version
&lt;/h2&gt;

&lt;p&gt;CLAUDE.md is not a README. It's not documentation. It's the answer to the question the AI needs to ask at the start of every session:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"What do I need to know to be useful right now?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Write it for that question. Update it every session. The compounding effect over months of development is hard to overstate.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building an open source self-hosted Docker ecosystem. If you're interested in the project or in how I use Claude Code to build it, follow along.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
