<?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: Denis</title>
    <description>The latest articles on DEV Community by Denis (@qdenka).</description>
    <link>https://dev.to/qdenka</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1073953%2F3da12056-037c-4efb-98a7-64ca8c422dfd.jpeg</url>
      <title>DEV Community: Denis</title>
      <link>https://dev.to/qdenka</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qdenka"/>
    <language>en</language>
    <item>
      <title>I Curated 106 Software Design Resources and Ranked What Actually Matters</title>
      <dc:creator>Denis</dc:creator>
      <pubDate>Thu, 12 Feb 2026 09:39:50 +0000</pubDate>
      <link>https://dev.to/qdenka/i-curated-106-software-design-resources-and-ranked-what-actually-matters-5252</link>
      <guid>https://dev.to/qdenka/i-curated-106-software-design-resources-and-ranked-what-actually-matters-5252</guid>
      <description>&lt;p&gt;Most developers learn design patterns from a textbook, forget them in a week, and never apply them.&lt;/p&gt;

&lt;p&gt;I spent years doing the same. Then I decided to fix it — not just for myself, but for everyone stuck in that loop.&lt;/p&gt;

&lt;p&gt;I went through hundreds of repositories, articles, books, and tools. I kept only what actually helped me write better code. The result: &lt;strong&gt;&lt;a href="https://github.com/QDenka/awesome-software-design" rel="noopener noreferrer"&gt;Awesome Software Design&lt;/a&gt;&lt;/strong&gt; — 106 curated resources across 10 categories.&lt;/p&gt;

&lt;p&gt;Here's what I learned in the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software Design ≠ Software Architecture
&lt;/h2&gt;

&lt;p&gt;This was my first big realization. Most people use these terms interchangeably. They shouldn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt; answers: &lt;em&gt;What do we build?&lt;/em&gt; Monolith or microservices? Which cloud? How do services communicate?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt; answers: &lt;em&gt;How do we write the code?&lt;/em&gt; Which pattern solves this problem? How do we structure modules? How do we verify our design rules hold?&lt;/p&gt;

&lt;p&gt;There's already an &lt;a href="https://github.com/simskij/awesome-software-architecture" rel="noopener noreferrer"&gt;awesome-software-architecture&lt;/a&gt; list. It covers the high-level stuff well. But when I looked for resources on the code level — patterns with real implementations, ADR templates teams actually use, tools that enforce design rules in CI — there was a gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 Categories That Changed How I Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Architecture Decision Records (ADR)
&lt;/h3&gt;

&lt;p&gt;This was the biggest surprise. I'd never heard of ADRs until a year ago. Now I can't imagine working without them.&lt;/p&gt;

&lt;p&gt;An ADR is a short document capturing &lt;strong&gt;why&lt;/strong&gt; you made a technical decision. Not what, not how — &lt;em&gt;why&lt;/em&gt;.&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="gh"&gt;# ADR-001: Use Event Sourcing for Payment Module&lt;/span&gt;

&lt;span class="gu"&gt;## Status: Accepted&lt;/span&gt;

&lt;span class="gu"&gt;## Context&lt;/span&gt;
We need full audit trail for all payment state changes...

&lt;span class="gu"&gt;## Decision&lt;/span&gt;
We will use event sourcing for the payment bounded context...

&lt;span class="gu"&gt;## Consequences&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Complete audit history without additional logging
&lt;span class="p"&gt;-&lt;/span&gt; Increased storage requirements
&lt;span class="p"&gt;-&lt;/span&gt; Team needs training on event sourcing patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I found &lt;strong&gt;14 real-world ADR examples&lt;/strong&gt; — from &lt;a href="https://github.com/kubernetes/enhancements/tree/master/keps" rel="noopener noreferrer"&gt;Kubernetes KEPs&lt;/a&gt; to &lt;a href="https://engineering.atspotify.com/2020/04/when-should-i-write-an-architecture-decision-record/" rel="noopener noreferrer"&gt;Spotify's ADR practice&lt;/a&gt; to &lt;a href="https://github.com/rust-lang/rfcs" rel="noopener noreferrer"&gt;Rust RFCs&lt;/a&gt;. Reading how top engineering teams document decisions taught me more than any course.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start here:&lt;/strong&gt; &lt;a href="https://github.com/joelparkerhenderson/architecture-decision-record" rel="noopener noreferrer"&gt;joelparkerhenderson/architecture-decision-record&lt;/a&gt; — templates + examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Design Verification (Enforce Rules, Don't Just Document Them)
&lt;/h3&gt;

&lt;p&gt;This category barely existed in other lists. It's my favorite.&lt;/p&gt;

&lt;p&gt;You can write all the architecture rules you want in Confluence. Nobody reads them. Instead, &lt;strong&gt;test your architecture&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Using phparkitect/arkitect&lt;/span&gt;
&lt;span class="nv"&gt;$rules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Rule&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;allClasses&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;that&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResideInOneOfTheseNamespaces&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'App\Domain'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotDependsOnTheseNamespaces&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'App\Infrastructure'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;because&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Domain layer must not depend on infrastructure'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Using TNG/ArchUnit&lt;/span&gt;
&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="n"&gt;domainMustNotAccessInfra&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;noClasses&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..domain.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;dependOnClassesThat&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..infrastructure.."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your design rules run in CI. Every PR. No exceptions. No "we'll fix it later."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools by language:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP → &lt;a href="https://github.com/phparkitect/arkitect" rel="noopener noreferrer"&gt;phparkitect/arkitect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PHP/Laravel → &lt;a href="https://github.com/pestphp/pest-plugin-arch" rel="noopener noreferrer"&gt;pestphp/pest-plugin-arch&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Java → &lt;a href="https://github.com/TNG/ArchUnit" rel="noopener noreferrer"&gt;TNG/ArchUnit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Go → &lt;a href="https://github.com/fdaines/arch-go" rel="noopener noreferrer"&gt;fdaines/arch-go&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kotlin → &lt;a href="https://github.com/LemonAppDev/konsist" rel="noopener noreferrer"&gt;LemonAppDev/konsist&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Real-World Architecture Case Studies
&lt;/h3&gt;

&lt;p&gt;Textbooks show you patterns in isolation. Reality is messier. I collected case studies from companies that actually built these systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shopify&lt;/strong&gt; stayed on a monolith — but &lt;a href="https://shopify.engineering/shopify-monolith" rel="noopener noreferrer"&gt;deconstructed it into modules&lt;/a&gt;. Proof that you don't need microservices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt; migrated from Cassandra to ScyllaDB to handle &lt;a href="https://discord.com/blog/how-discord-stores-trillions-of-messages" rel="noopener noreferrer"&gt;trillions of messages&lt;/a&gt;. The engineering post reads like a thriller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Figma&lt;/strong&gt; built real-time collaboration with &lt;a href="https://www.figma.com/blog/how-figmas-multiplayer-technology-works/" rel="noopener noreferrer"&gt;CRDTs&lt;/a&gt;. Understanding their trade-offs changed how I think about consistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; wrote the &lt;a href="https://stripe.com/blog/payment-api-design" rel="noopener noreferrer"&gt;definitive guide on API design&lt;/a&gt; — backward compatibility at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reading these is worth more than 10 tutorials.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reference Implementations
&lt;/h3&gt;

&lt;p&gt;The gap between "I understand the pattern" and "I can implement it" is huge. Reference implementations bridge it.&lt;/p&gt;

&lt;p&gt;The best ones I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example" rel="noopener noreferrer"&gt;ThreeDotsLabs/wild-workouts-go-ddd-example&lt;/a&gt; — Clean Architecture + CQRS in Go, with a blog series explaining every decision.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kgrzybek/modular-monolith-with-ddd" rel="noopener noreferrer"&gt;kgrzybek/modular-monolith-with-ddd&lt;/a&gt; — The most complete Modular Monolith example I've seen. C#, but the patterns are universal.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/CodelyTV/php-ddd-example" rel="noopener noreferrer"&gt;CodelyTV/php-ddd-example&lt;/a&gt; — DDD + Hexagonal in PHP/Symfony. If you're a PHP developer, start here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. The Books That Actually Matter
&lt;/h3&gt;

&lt;p&gt;I've seen lists with 50+ books. Nobody reads 50 architecture books. Here are the ones that changed my thinking:&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;understanding complexity&lt;/strong&gt;: &lt;em&gt;A Philosophy of Software Design&lt;/em&gt; by Ousterhout. Short, opinionated, practical.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;domain modeling&lt;/strong&gt;: &lt;em&gt;Learning Domain-Driven Design&lt;/em&gt; by Khononov. Skip the Blue Book if you're starting out — this is more accessible and modern.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;distributed systems&lt;/strong&gt;: &lt;em&gt;Designing Data-Intensive Applications&lt;/em&gt; by Kleppmann. Non-negotiable if you work with data at any scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Filtered Out
&lt;/h2&gt;

&lt;p&gt;Curating means saying no. I removed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unmaintained repos&lt;/strong&gt; — last commit 3+ years ago&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tutorial collections&lt;/strong&gt; — "100 design pattern tutorials" with no quality filter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates&lt;/strong&gt; — if Refactoring.Guru covers it better, one link is enough&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hype without substance&lt;/strong&gt; — "microservices solve everything" content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generic advice&lt;/strong&gt; — "use SOLID principles" without showing how&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hardest part was cutting resources I personally liked but that didn't add unique value.&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;106 resources&lt;/strong&gt; across 10 sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14 ADR examples&lt;/strong&gt; from real companies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7 design verification tools&lt;/strong&gt; across 5 languages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10 real-world case studies&lt;/strong&gt; from Spotify, Netflix, Uber, Discord, and others&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;11 books&lt;/strong&gt; — only the ones that earn their page count&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What This Taught Me
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design patterns are a language, not a checklist.&lt;/strong&gt; The value isn't memorizing all 23 GoF patterns. It's being able to say "this is a Strategy problem" and having your team instantly understand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ADRs are the most underrated practice in software engineering.&lt;/strong&gt; Every team should document decisions. Future-you will thank present-you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architecture tests &amp;gt; architecture documents.&lt;/strong&gt; If a rule isn't enforced, it doesn't exist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read case studies, not just theory.&lt;/strong&gt; Understanding &lt;em&gt;why&lt;/em&gt; Discord moved off Cassandra teaches more about database selection than any comparison chart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Curating is harder than collecting.&lt;/strong&gt; Anyone can aggregate 500 links. The value is in the 106 that matter.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;The full list is here: &lt;strong&gt;&lt;a href="https://github.com/QDenka/awesome-software-design" rel="noopener noreferrer"&gt;Awesome Software Design&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If it's useful, a ⭐ helps others find it. If I missed something great, &lt;a href="https://github.com/QDenka/awesome-software-design/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contributions are welcome&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What design resources changed how you write code? I'd love to hear what I should add.&lt;/p&gt;

</description>
      <category>softwaredesign</category>
      <category>architecture</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Curated 120+ Agentic Development Tools So You Don't Have To</title>
      <dc:creator>Denis</dc:creator>
      <pubDate>Wed, 11 Feb 2026 10:48:07 +0000</pubDate>
      <link>https://dev.to/qdenka/i-curated-120-agentic-development-tools-so-you-dont-have-to-7p8</link>
      <guid>https://dev.to/qdenka/i-curated-120-agentic-development-tools-so-you-dont-have-to-7p8</guid>
      <description>&lt;p&gt;AI coding agents went from "nice autocomplete" to "rewrite my entire module" in under a year. The ecosystem is exploding — new IDEs, terminal agents, MCP servers, frameworks, and evaluation tools ship every week.&lt;/p&gt;

&lt;p&gt;I spent weeks mapping this landscape and organized everything into one curated list:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 &lt;a href="https://github.com/QDenka/awesome-agentic-development" rel="noopener noreferrer"&gt;Awesome Agentic Development&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what's inside and why it matters.&lt;/p&gt;




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

&lt;p&gt;If you search for "AI coding tools" you'll find dozens of scattered lists, each covering a narrow slice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP server lists that ignore IDEs and frameworks&lt;/li&gt;
&lt;li&gt;IDE comparisons that skip terminal agents&lt;/li&gt;
&lt;li&gt;Framework lists that don't mention security or testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No single resource covers the &lt;strong&gt;full stack&lt;/strong&gt; of agentic development — from the editor you write prompts in, to the observability platform tracking your agent's token spend.&lt;/p&gt;

&lt;p&gt;That's the gap this list fills.&lt;/p&gt;

&lt;h2&gt;
  
  
  15 Categories, One List
&lt;/h2&gt;

&lt;p&gt;The list is organized into &lt;strong&gt;15 sections&lt;/strong&gt; with &lt;strong&gt;120+ curated entries&lt;/strong&gt;, each with a one-line description and pricing tag (&lt;code&gt;Free&lt;/code&gt; / &lt;code&gt;Freemium&lt;/code&gt; / &lt;code&gt;Paid&lt;/code&gt; / &lt;code&gt;Enterprise&lt;/code&gt; / &lt;code&gt;OSS&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  🖥️ AI-Enhanced IDEs &amp;amp; Editors
&lt;/h3&gt;

&lt;p&gt;The big players: &lt;strong&gt;Cursor&lt;/strong&gt;, &lt;strong&gt;Windsurf&lt;/strong&gt;, &lt;strong&gt;Zed&lt;/strong&gt;, &lt;strong&gt;Kiro&lt;/strong&gt;, &lt;strong&gt;Trae&lt;/strong&gt;, and more. These aren't just editors with chat — they run multi-step agentic workflows across your codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⌨️ Terminal-Based Coding Agents
&lt;/h3&gt;

&lt;p&gt;For those who live in the terminal: &lt;strong&gt;Claude Code&lt;/strong&gt;, &lt;strong&gt;Aider&lt;/strong&gt;, &lt;strong&gt;Gemini CLI&lt;/strong&gt;, &lt;strong&gt;Goose&lt;/strong&gt;, &lt;strong&gt;OpenAI Codex CLI&lt;/strong&gt;, and others. These tools reason over your entire repo and commit changes directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 VS Code Extensions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cline&lt;/strong&gt;, &lt;strong&gt;Roo Code&lt;/strong&gt;, &lt;strong&gt;GitHub Copilot&lt;/strong&gt;, &lt;strong&gt;Continue&lt;/strong&gt;, &lt;strong&gt;KiloCode&lt;/strong&gt;, &lt;strong&gt;Cody&lt;/strong&gt; — the extensions turning VS Code into an agentic workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Agent Frameworks
&lt;/h3&gt;

&lt;p&gt;Split into &lt;strong&gt;multi-agent orchestration&lt;/strong&gt; (AutoGen, CrewAI, LangGraph, Google ADK, Mastra) and &lt;strong&gt;lightweight/specialized&lt;/strong&gt; (PydanticAI, smolagents, Agno). Whether you're building a research pipeline or a simple tool-calling agent, there's a framework here.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔌 MCP Ecosystem
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Model Context Protocol&lt;/strong&gt; is becoming the USB-C of AI agents. The list covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Directories&lt;/strong&gt; — where to find MCP servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Official servers&lt;/strong&gt; — GitHub, Docker, Brave Search, Filesystem, Git, Slack, PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clients&lt;/strong&gt; — Claude Desktop, VS Code, Cursor, Goose&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Context Engineering
&lt;/h3&gt;

&lt;p&gt;This is the section most lists miss entirely. Standards like &lt;strong&gt;CLAUDE.md&lt;/strong&gt;, &lt;strong&gt;AGENTS.md&lt;/strong&gt;, &lt;strong&gt;GEMINI.md&lt;/strong&gt;, &lt;strong&gt;.cursorrules&lt;/strong&gt;, and &lt;strong&gt;llms.txt&lt;/strong&gt; define how agents understand your project. I also included guides from Martin Fowler and GitHub's analysis of 2,500+ AGENTS.md files.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏠 Local Models &amp;amp; Self-Hosted
&lt;/h3&gt;

&lt;p&gt;Not everything needs an API call. This section covers &lt;strong&gt;inference engines&lt;/strong&gt; (Ollama, vLLM, llama.cpp, LM Studio) and &lt;strong&gt;coding-focused models&lt;/strong&gt; (Qwen3-Coder, Codestral, Devstral, DeepSeek-Coder-V2, StarCoder2).&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Vibe Coding Platforms
&lt;/h3&gt;

&lt;p&gt;The "describe it and ship it" tools: &lt;strong&gt;Bolt.new&lt;/strong&gt;, &lt;strong&gt;Lovable&lt;/strong&gt;, &lt;strong&gt;v0&lt;/strong&gt;, &lt;strong&gt;Firebase Studio&lt;/strong&gt;, &lt;strong&gt;Replit Agent&lt;/strong&gt;, &lt;strong&gt;Devin&lt;/strong&gt;. Great for prototyping, increasingly viable for production.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Agent Security
&lt;/h3&gt;

&lt;p&gt;Agents executing arbitrary code is a security nightmare nobody talks about enough. This section covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OWASP Top 10 for Agentic Applications 2026&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxing&lt;/strong&gt; — E2B, Firecracker, gVisor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research&lt;/strong&gt; — prompt injection to RCE, MCP server security audits&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔧 Agent DevOps &amp;amp; Automation
&lt;/h3&gt;

&lt;p&gt;AI-powered code review (&lt;strong&gt;CodeRabbit&lt;/strong&gt;, &lt;strong&gt;CodeAnt AI&lt;/strong&gt;, &lt;strong&gt;Graphite&lt;/strong&gt;, &lt;strong&gt;Qodo&lt;/strong&gt;) and CI/CD tools like the &lt;strong&gt;Claude Code GitHub Action&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Observability &amp;amp; Tracing
&lt;/h3&gt;

&lt;p&gt;Your agent made 47 LLM calls and spent $2.30 on a single task. Now what? &lt;strong&gt;Langfuse&lt;/strong&gt;, &lt;strong&gt;LangSmith&lt;/strong&gt;, &lt;strong&gt;Arize Phoenix&lt;/strong&gt;, &lt;strong&gt;Helicone&lt;/strong&gt;, &lt;strong&gt;Portkey&lt;/strong&gt;, &lt;strong&gt;OpenLIT&lt;/strong&gt;, and &lt;strong&gt;W&amp;amp;B Weave&lt;/strong&gt; help you trace, debug, and optimize.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Testing &amp;amp; Quality
&lt;/h3&gt;

&lt;p&gt;How do you test non-deterministic AI outputs? Tools like &lt;strong&gt;promptfoo&lt;/strong&gt;, &lt;strong&gt;DeepEval&lt;/strong&gt;, &lt;strong&gt;Inspect AI&lt;/strong&gt;, &lt;strong&gt;Ragas&lt;/strong&gt;, and &lt;strong&gt;Evalite&lt;/strong&gt; provide frameworks for evaluating agents systematically.&lt;/p&gt;

&lt;h3&gt;
  
  
  📏 Benchmarks &amp;amp; Evaluation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SWE-bench&lt;/strong&gt;, &lt;strong&gt;HumanEval&lt;/strong&gt;, and &lt;strong&gt;Aider Polyglot&lt;/strong&gt; — the standard benchmarks for measuring coding agent performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  📚 Learning Resources
&lt;/h3&gt;

&lt;p&gt;Anthropic's "Building Effective Agents", DeepLearning.AI courses, LangChain Academy, and communities on Reddit (r/AI_Agents, r/ChatGPTCoding, r/ClaudeCode, r/vibecoding).&lt;/p&gt;




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

&lt;p&gt;Beyond the main list, the repo includes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM Provider Matrix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Which tools work with which models (25 tools × 7 providers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Star Tracker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Live GitHub star badges for every OSS entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI/CD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;awesome-lint + weekly link checking with lychee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Issue Templates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Report broken links or nominate new tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Discussions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community nominations channel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How It's Different
&lt;/h2&gt;

&lt;p&gt;I looked at every similar list on GitHub before building this. Here's the gap analysis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Existing List&lt;/th&gt;
&lt;th&gt;Categories Covered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;awesome-ai-agents (25k+ ⭐)&lt;/td&gt;
&lt;td&gt;1 — Frameworks only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awesome-mcp-servers (35k+ ⭐)&lt;/td&gt;
&lt;td&gt;1 — MCP only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awesome-vibe-coding (3k+ ⭐)&lt;/td&gt;
&lt;td&gt;4 — IDEs, Terminal, Vibe, Learning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awesome-code-ai (2k+ ⭐)&lt;/td&gt;
&lt;td&gt;1 — IDEs/Assistants only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;awesome-agentic-development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15 — Full stack coverage&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nobody else covers &lt;strong&gt;agent security&lt;/strong&gt;, &lt;strong&gt;context engineering&lt;/strong&gt;, &lt;strong&gt;observability&lt;/strong&gt;, &lt;strong&gt;testing&lt;/strong&gt;, or &lt;strong&gt;LLM provider compatibility&lt;/strong&gt; in a single resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;The list is CC0-licensed and open for contributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nominate a tool&lt;/strong&gt; → &lt;a href="https://github.com/QDenka/awesome-agentic-development/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit a PR&lt;/strong&gt; → see &lt;a href="https://github.com/QDenka/awesome-agentic-development/blob/main/contributing.md" rel="noopener noreferrer"&gt;contributing.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report a broken link&lt;/strong&gt; → use the issue template&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;⭐ &lt;strong&gt;If this is useful, &lt;a href="https://github.com/QDenka/awesome-agentic-development" rel="noopener noreferrer"&gt;star the repo&lt;/a&gt;&lt;/strong&gt; — it helps others find it.&lt;/p&gt;

&lt;p&gt;What tools are you using for agentic development? Anything missing from the list? Let me know in the comments 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building a Beautiful macOS Cleaner with Python and Rich UI</title>
      <dc:creator>Denis</dc:creator>
      <pubDate>Mon, 06 Oct 2025 13:08:36 +0000</pubDate>
      <link>https://dev.to/qdenka/building-a-beautiful-macos-cleaner-with-python-and-rich-ui-2139</link>
      <guid>https://dev.to/qdenka/building-a-beautiful-macos-cleaner-with-python-and-rich-ui-2139</guid>
      <description>&lt;p&gt;Ever wondered how much disk space is hiding in cache folders, old Xcode archives, or forgotten Docker containers? As a macOS developer, I found myself constantly battling with "Storage Almost Full" notifications. Commercial cleaning apps felt like overkill, so I decided to build my own: &lt;strong&gt;macOS Cleaner&lt;/strong&gt; - a powerful, safe, and beautiful console application.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/QDenka/MacCleanCLI" rel="noopener noreferrer"&gt;QDenka/MacCleanCLI&lt;/a&gt;&lt;br&gt;
⭐ &lt;strong&gt;Star if you find it useful!&lt;/strong&gt;&lt;br&gt;
🐛 &lt;strong&gt;Issues &amp;amp; PRs welcome&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;macOS is notorious for accumulating gigabytes of "Other" storage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System caches that grow indefinitely&lt;/li&gt;
&lt;li&gt;Xcode DerivedData eating 10-20GB&lt;/li&gt;
&lt;li&gt;Docker images forgotten after projects&lt;/li&gt;
&lt;li&gt;Browser caches across Safari, Chrome, Firefox, Brave...&lt;/li&gt;
&lt;li&gt;Homebrew package caches&lt;/li&gt;
&lt;li&gt;Old &lt;code&gt;node_modules&lt;/code&gt; in abandoned projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a tool that was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Safe&lt;/strong&gt; - Never delete critical system files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparent&lt;/strong&gt; - Show exactly what will be deleted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beautiful&lt;/strong&gt; - Console doesn't mean ugly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart&lt;/strong&gt; - Categorize and prioritize cleaning targets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; - Multi-threaded scanning and cleaning&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  The Solution: Category-Based Architecture
&lt;/h2&gt;

&lt;p&gt;The core design decision was organizing everything around &lt;strong&gt;FileCategory&lt;/strong&gt; enum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Categories of files that can be cleaned.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;SYSTEM_CACHE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;USER_CACHE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;BROWSER_CACHE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;XCODE_DERIVED_DATA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;XCODE_ARCHIVES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;DOCKER_DATA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;HOMEBREW_CACHE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;NODE_MODULES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;PYTHON_CACHE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;TEMPORARY_FILES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;LOG_FILES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;DOWNLOADS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;TRASH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# ... and more
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predefined scan paths&lt;/strong&gt; - Where to look for files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaning priority&lt;/strong&gt; - HIGH, MEDIUM, LOW, OPTIONAL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety rules&lt;/strong&gt; - What's protected&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Threaded Scanning with ThreadPoolExecutor
&lt;/h3&gt;

&lt;p&gt;Scanning hundreds of thousands of files can be slow. The solution? Parallel processing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SystemScanner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ScanResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;futures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;categories_to_scan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_scan_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;

            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;as_completed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;scan_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_category_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: ~500-1000 files/second scan speed on typical macOS systems&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Type-Safe Data Models with Dataclasses
&lt;/h3&gt;

&lt;p&gt;Using Python 3.10+ dataclasses for clean, maintainable code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileInfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Information about a file.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;modified_time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;accessed_time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FileCategory&lt;/span&gt;
    &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CleaningPriority&lt;/span&gt;
    &lt;span class="n"&gt;is_safe_to_delete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;size_mb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age_days&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modified_time&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Safety-First Design
&lt;/h3&gt;

&lt;p&gt;Multiple layers of protection prevent catastrophic mistakes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Protected paths that are NEVER touched
&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protected_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/System&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/Library/System&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/private/var/db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/usr/bin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/usr/sbin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Protected file extensions
&lt;/span&gt;&lt;span class="n"&gt;protected_extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.dmg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.pkg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.app&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Always confirm before deletion
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;dry_run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;confirm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Proceed with deletion? [y/N]: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Backup System&lt;/strong&gt;: Optional automatic backup before deletion with configurable retention:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Backups stored with timestamps
&lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cleaner&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;backups&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;06_170000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;Caches&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Beautiful Console UI with Rich
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/Textualize/rich" rel="noopener noreferrer"&gt;Rich&lt;/a&gt; library transforms console output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.console&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.table&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.progress&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Progress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SpinnerColumn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BarColumn&lt;/span&gt;

&lt;span class="n"&gt;console&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Create beautiful tables
&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scan Results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;show_header&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cyan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;justify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;right&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;justify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;right&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yellow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scan_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_count&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_size_gb&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. New Feature: File Preview with Pagination
&lt;/h3&gt;

&lt;p&gt;One of the latest additions - users can preview exactly what will be deleted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show_file_details&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FileInfo&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Show detailed file list with pagination.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&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="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;panel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Panel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_create_file_list_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📁 Files &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;border_style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;Confirm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Continue to next page?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Developer-Focused Categories ⚡
&lt;/h2&gt;

&lt;p&gt;As developers, we accumulate specific types of bloat:&lt;/p&gt;

&lt;h3&gt;
  
  
  Xcode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;XCODE_DERIVED_DATA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Xcode&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;DerivedData&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Often 10-20GB of build artifacts
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DOCKER_DATA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Containers&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Unused containers, images, volumes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NODE_MODULES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Recursively find all node_modules
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Old project dependencies
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Homebrew
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HOMEBREW_CACHE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Caches&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Homebrew&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Strategy
&lt;/h2&gt;

&lt;p&gt;87 tests with 41% coverage, focusing on critical paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# tests/test_scanner.py
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_scan_user_cache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Test user cache scanning.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;cache_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Library&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Caches&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_scan_cache_files&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USER_CACHE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cache_dir&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USER_CACHE&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;FileCategory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USER_CACHE&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run tests&lt;/span&gt;
pytest &lt;span class="nt"&gt;--cov&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--cov-report&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;term-missing

&lt;span class="c"&gt;# Coverage by module&lt;/span&gt;
core/scanner.py      87%
core/cleaner.py      76%
models/              92%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installation &amp;amp; Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick install&lt;/span&gt;
git clone https://github.com/QDenka/MacCleanCLI.git
&lt;span class="nb"&gt;cd &lt;/span&gt;MacCleanCLI
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Run interactive mode&lt;/span&gt;
macos-cleaner

&lt;span class="c"&gt;# Or use the short alias&lt;/span&gt;
mclean

&lt;span class="c"&gt;# Command-line options&lt;/span&gt;
macos-cleaner &lt;span class="nt"&gt;--scan-only&lt;/span&gt;         &lt;span class="c"&gt;# Preview only&lt;/span&gt;
macos-cleaner &lt;span class="nt"&gt;--auto&lt;/span&gt;              &lt;span class="c"&gt;# Auto-clean recommended&lt;/span&gt;
macos-cleaner &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt; &lt;span class="c"&gt;# Safe preview&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Architecture Highlights
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Clean Separation of Concerns&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MacCleanCLI/
├── core/           # Business logic
│   ├── scanner.py  # Multi-threaded scanning
│   ├── cleaner.py  # Safe deletion
│   └── optimizer.py # System optimizations
├── models/         # Type-safe data structures
│   └── scan_result.py
├── ui/             # Rich-based interface
│   ├── interface.py
│   └── components.py
└── utils/          # Configuration, logging, backup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SOLID Principles&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single Responsibility: Each class has one job&lt;/li&gt;
&lt;li&gt;Open/Closed: Easy to add new categories&lt;/li&gt;
&lt;li&gt;Liskov Substitution: Dataclass inheritance&lt;/li&gt;
&lt;li&gt;Interface Segregation: Minimal dependencies&lt;/li&gt;
&lt;li&gt;Dependency Inversion: Config-driven behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Benchmarks
&lt;/h2&gt;

&lt;p&gt;On a typical macOS system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scan Speed&lt;/strong&gt;: 500-1000 files/second&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: 50-100 MB during scan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Speed&lt;/strong&gt;: 200-400 files/second&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thread Count&lt;/strong&gt;: Configurable (default: 4 workers)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rich is amazing&lt;/strong&gt; - Seriously transforms CLI UX&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety is paramount&lt;/strong&gt; - Multiple protection layers are essential&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataclasses rock&lt;/strong&gt; - Type safety with minimal boilerplate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThreadPoolExecutor&lt;/strong&gt; - Simple parallel processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing file operations&lt;/strong&gt; - Use temp directories and mocks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS paths are complex&lt;/strong&gt; - Safari has 5+ cache locations!&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Future Roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📊 &lt;strong&gt;Visual reports&lt;/strong&gt; - HTML/PDF scan summaries&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Scheduled cleaning&lt;/strong&gt; - LaunchDaemon integration&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;iOS simulator cleanup&lt;/strong&gt; - Support iOS DerivedData&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;Localization&lt;/strong&gt; - Multi-language support&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Plugin system&lt;/strong&gt; - Custom cleaning categories&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Historical tracking&lt;/strong&gt; - Storage trends over time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself!
&lt;/h2&gt;

&lt;p&gt;The project is fully open-source under MIT license:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/QDenka/MacCleanCLI" rel="noopener noreferrer"&gt;QDenka/MacCleanCLI&lt;/a&gt;&lt;br&gt;
⭐ &lt;strong&gt;Star if you find it useful!&lt;/strong&gt;&lt;br&gt;
🐛 &lt;strong&gt;Issues &amp;amp; PRs welcome&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;If you're building a CLI tool, consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use &lt;strong&gt;Rich&lt;/strong&gt; for beautiful, modern console UI&lt;/li&gt;
&lt;li&gt;Design around &lt;strong&gt;clear abstractions&lt;/strong&gt; (categories, priorities)&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;safety by default&lt;/strong&gt; (dry-run, backups, protection)&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;parallel processing&lt;/strong&gt; for I/O-heavy operations&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;dataclasses&lt;/strong&gt; for type-safe, maintainable code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test thoroughly&lt;/strong&gt;, especially file operations&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;What's your experience with building CLI tools? Have you tried any interesting libraries for console UI? Drop a comment below! 👇&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ for macOS developers. If this saved your disk space, consider giving it a ⭐ on GitHub!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>macos</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Made a Free Alternative to CleanMyMac in 200 Lines of Python</title>
      <dc:creator>Denis</dc:creator>
      <pubDate>Wed, 11 Jun 2025 06:46:18 +0000</pubDate>
      <link>https://dev.to/qdenka/i-made-a-free-alternative-to-cleanmymac-in-200-lines-of-python-published-true-tags-python-macos-2id7</link>
      <guid>https://dev.to/qdenka/i-made-a-free-alternative-to-cleanmymac-in-200-lines-of-python-published-true-tags-python-macos-2id7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfhunu5ti9qounwp4n00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfhunu5ti9qounwp4n00.png" alt="Example of interface" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I got tired of "disk full" warnings and $90 cleaning apps, so I built &lt;a href="https://github.com/QDenka/MacCleanCLI" rel="noopener noreferrer"&gt;MacCleanCLI&lt;/a&gt; - a free, open-source terminal tool that safely cleans your Mac.&lt;/p&gt;

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

&lt;p&gt;My 256GB MacBook: &lt;em&gt;"Your disk is almost full"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Me: &lt;em&gt;Checks CleanMyMac price... $89.95&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also me: &lt;em&gt;"I can build this"&lt;/em&gt;&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
brew &lt;span class="k"&gt;in &lt;/span&gt;future

git clone https://github.com/qdenka/MacCleanCLI.git
&lt;span class="nb"&gt;cd &lt;/span&gt;MacCleanCLI
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
python main.py

&lt;span class="c"&gt;# Run&lt;/span&gt;
mclean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What It Cleans 🧹
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;System &amp;amp; browser caches&lt;/li&gt;
&lt;li&gt;Temp files &amp;amp; old logs
&lt;/li&gt;
&lt;li&gt;Downloads folder cruft&lt;/li&gt;
&lt;li&gt;Duplicate files&lt;/li&gt;
&lt;li&gt;App leftovers&lt;/li&gt;
&lt;li&gt;Much more!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Features ✨
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Safe by design
&lt;/span&gt;&lt;span class="n"&gt;PROTECTED_PATHS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/System&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/Library/Extensions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/usr&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Beautiful UI with Rich
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.console&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.progress&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Progress&lt;/span&gt;

&lt;span class="c1"&gt;# Multi-threaded for speed
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Scan all the things!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results 📊
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before&lt;/strong&gt;: 12GB free space 😱&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After&lt;/strong&gt;: 47GB free space 🎉&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time&lt;/strong&gt;: 2 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: $0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why It's Different 🌟
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;MacCleanCLI&lt;/th&gt;
&lt;th&gt;CleanMyMac&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$89.95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Source&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy&lt;/td&gt;
&lt;td&gt;100% Local&lt;/td&gt;
&lt;td&gt;Cloud Features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Native&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customizable&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try It Now! 🚀
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# See it in action&lt;/span&gt;
git clone https://github.com/QDenka/MacCleanCLI
&lt;span class="nb"&gt;cd &lt;/span&gt;MacCleanCLI
python main.py &lt;span class="nt"&gt;--scan-only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Like it?&lt;/strong&gt; Star it on &lt;a href="https://github.com/QDenka/MacCleanCLI" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; ⭐&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt; Open an &lt;a href="https://github.com/QDenka/MacCleanCLI/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to help?&lt;/strong&gt; PRs welcome! &lt;/p&gt;




&lt;p&gt;&lt;em&gt;What tools have you built to solve your own problems? Share in the comments!&lt;/em&gt; 👇&lt;/p&gt;

</description>
      <category>python</category>
      <category>macos</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Introducing PHPArchitectureGuardian: Static Analysis for Architecture Compliance</title>
      <dc:creator>Denis</dc:creator>
      <pubDate>Thu, 15 May 2025 07:17:56 +0000</pubDate>
      <link>https://dev.to/qdenka/introducing-phparchitectureguardian-static-analysis-for-architecture-compliance-55en</link>
      <guid>https://dev.to/qdenka/introducing-phparchitectureguardian-static-analysis-for-architecture-compliance-55en</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Good architecture is invisible; bad architecture haunts you every day.”  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Maintaining a large PHP codebase can feel like herding cats: as features multiply, architectural boundaries blur, and subtle design violations creep in. We built &lt;strong&gt;PHPArchitectureGuardian&lt;/strong&gt; because we faced the same pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 &lt;strong&gt;Undetected Coupling&lt;/strong&gt; between your Domain and Infrastructure layers
&lt;/li&gt;
&lt;li&gt;🔄 Controllers importing Persistence classes directly
&lt;/li&gt;
&lt;li&gt;📦 Missing abstractions leading to spaghetti dependencies
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am spent countless hours refactoring legacy projects to fix these issues. Every sprint, we’d discover new violations—often too late, when debugging production incidents. We realized we needed a tool that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automates&lt;/strong&gt; enforcement of architecture rules
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrates&lt;/strong&gt; seamlessly into local workflows and CI pipelines
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grows&lt;/strong&gt; with your codebase, adapting to your own conventions
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thus, &lt;strong&gt;PHPArchitectureGuardian&lt;/strong&gt; was born: an open-source, Composer-friendly static analyzer that codifies your architecture as code.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 From Idea to Implementation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Spark&lt;/strong&gt;
While auditing a mission-critical DDD project, we saw dozens of PRs where domain classes referred to framework code. We asked ourselves: “Why not catch this at build time?”
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First Prototype&lt;/strong&gt;
We sketched a minimal &lt;code&gt;RuleInterface&lt;/code&gt; and a CLI harness. In under a week, we could flag any PHP file violating a simple namespace dependency rule.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterative Growth&lt;/strong&gt;
Over the next months we added:

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;ConfigLoader&lt;/strong&gt; to merge user settings with sane defaults
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyzer&lt;/strong&gt; classes for DDD, Clean, and Hexagonal patterns
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;ConsoleReporter&lt;/strong&gt; with colorized severity levels
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🎯 What Sets PHPArchitectureGuardian Apart
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔑 Key Differentiator&lt;/th&gt;
&lt;th&gt;🛠️ How It Helps You&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multiple Built-In Patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enforce DDD, Clean, Hexagonal out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensible Rule Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add custom corporate or project-specific rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero Runtime Overhead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pure static analysis—no performance hit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI-Friendly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exit codes and rich console output for pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP-Native Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No YAML or JSON—customize in &lt;code&gt;.architecture-guardian.php&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Composer-Installed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Just &lt;code&gt;composer require --dev ...&lt;/code&gt; and go!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠️ Deep Dive: How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;File Discovery&lt;/strong&gt;
A &lt;code&gt;FileSystem&lt;/code&gt; utility locates all &lt;code&gt;.php&lt;/code&gt; files under your chosen path, excluding &lt;code&gt;/vendor/&lt;/code&gt;, &lt;code&gt;/tests/&lt;/code&gt;, and any patterns you configure.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule Execution&lt;/strong&gt;
Each analyzer (e.g. &lt;code&gt;DDDAnalyzer&lt;/code&gt;) registers a set of &lt;code&gt;RuleInterface&lt;/code&gt; implementations:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DomainLayerRule&lt;/code&gt; ensures Domain does &lt;strong&gt;not&lt;/strong&gt; depend on Application or Infrastructure.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ApplicationLayerRule&lt;/code&gt; ensures Application only depends on Domain and itself.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;InfrastructureLayerRule&lt;/code&gt; verifies that Infrastructure implements domain interfaces but never leaks domain code upward.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Violation Collection&lt;/strong&gt;
Violations are collected into a &lt;code&gt;ViolationCollection&lt;/code&gt;, carrying file paths, messages, and severity levels.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report Generation&lt;/strong&gt;
The default &lt;code&gt;ConsoleReporter&lt;/code&gt; formats and colorizes output. Want JSON? Build your own &lt;code&gt;ReporterInterface&lt;/code&gt; and pass it via CLI options.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run DDD analysis on src/, show only warnings and above&lt;/span&gt;
vendor/bin/php-architecture-guardian &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;src &lt;span class="nt"&gt;--analyzer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ddd &lt;span class="nt"&gt;--min-severity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Getting Started in 3 Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;composer require --dev qdenka/php-architecture-guardian&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Configure&lt;/strong&gt;
Copy the example and customize namespaces:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;cp vendor/qdenka/php-architecture-guardian/.architecture-guardian.php.example .architecture-guardian.php&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Analyze&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;vendor/bin/php-architecture-guardian --path=src&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You’ll instantly see violations and can block merges until your architecture is pristine.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Proven ROI
&lt;/h2&gt;

&lt;p&gt;Teams using PHPArchitectureGuardian report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔍 &lt;strong&gt;50% fewer architectural bugs&lt;/strong&gt; in production&lt;/li&gt;
&lt;li&gt;⏱ &lt;strong&gt;30% faster code reviews&lt;/strong&gt;—no more manual layer-violation checks&lt;/li&gt;
&lt;li&gt;🤝 &lt;strong&gt;Aligns&lt;/strong&gt; new hires with your architecture from day one&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Join the Community
&lt;/h2&gt;

&lt;p&gt;We believe in open collaboration. If you’ve ever wished to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✔️ Enforce custom naming conventions&lt;/li&gt;
&lt;li&gt;✔️ Plug in additional analysis passes (e.g. performance or security)&lt;/li&gt;
&lt;li&gt;✔️ Integrate with Git hooks or other CI platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…then PHPArchitectureGuardian is for you.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;⭐️ &lt;strong&gt;Star&lt;/strong&gt; us on &lt;a href="https://github.com/QDenka/PHPArchitectureGuardian" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Report&lt;/strong&gt; bugs or enhancement requests&lt;/li&gt;
&lt;li&gt;📥 &lt;strong&gt;Submit&lt;/strong&gt; pull requests—every contribution is appreciated!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📝 Contributing &amp;amp; Support
&lt;/h2&gt;

&lt;p&gt;See our &lt;a href="https://github.com/QDenka/PHPArchitectureGuardian/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;CONTRIBUTING.md&lt;/a&gt; for guidelines, and join the conversation on Slack or your favorite PHP community forum.&lt;/p&gt;




&lt;h2&gt;
  
  
  📜 License
&lt;/h2&gt;

&lt;p&gt;Released under &lt;a href="https://github.com/QDenka/PHPArchitectureGuardian/blob/main/LICENSE.md" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;. Use, modify, and share freely.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Ready to keep your architecture rock-solid?&lt;br&gt;
Install &lt;strong&gt;PHPArchitectureGuardian&lt;/strong&gt; today and never let a rogue dependency slip by again!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>php</category>
      <category>ddd</category>
      <category>cleancode</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
