<?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: DaisukeYoda</title>
    <description>The latest articles on DEV Community by DaisukeYoda (@daisukeyoda).</description>
    <link>https://dev.to/daisukeyoda</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%2F3558584%2F413c468b-ac5d-4408-b4b6-8ba908a270fb.png</url>
      <title>DEV Community: DaisukeYoda</title>
      <link>https://dev.to/daisukeyoda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daisukeyoda"/>
    <language>en</language>
    <item>
      <title>Your Perfect Package Name? Someone Took It in 2014.</title>
      <dc:creator>DaisukeYoda</dc:creator>
      <pubDate>Tue, 17 Feb 2026 16:54:46 +0000</pubDate>
      <link>https://dev.to/daisukeyoda/your-perfect-package-name-someone-took-it-in-2014-3j89</link>
      <guid>https://dev.to/daisukeyoda/your-perfect-package-name-someone-took-it-in-2014-3j89</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%2Fepd0prtcifqy66u82omz.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%2Fepd0prtcifqy66u82omz.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;The Package Name Land Grab Is Real, and It's Getting Worse&lt;/p&gt;

&lt;h2&gt;
  
  
  You've Got a Great Name. Someone Else Got There First.
&lt;/h2&gt;

&lt;p&gt;"I've got it. The perfect name."&lt;/p&gt;

&lt;p&gt;You type it into pip. Or npm. And there it is: a repo from 2014. Three commits. No README. Last touched when Obama was still president. But the name? Taken.&lt;/p&gt;

&lt;p&gt;This is happening to developers every day. Python's user base exploded. JavaScript's ecosystem grew into something nobody planned for. And the central registries that hold it all together, PyPI and npm, are running out of good names. Not just any names. The short, clean, memorable ones that every developer reaches for: &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;request&lt;/code&gt;, &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Think of them as the Ginza or Manhattan of the digital world. Prime real estate. And it's basically all gone.&lt;/p&gt;

&lt;p&gt;This isn't just annoying. It's turning into a real governance problem, one that touches on digital land rights, trust, security, and how we organize shared resources. Let me explain what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Did We Get Here?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Micro-packages Ate the Namespace
&lt;/h3&gt;

&lt;p&gt;Part of the blame falls on a culture that took a good idea too far. Especially in the npm world.&lt;/p&gt;

&lt;p&gt;"Do one thing and do it well." Great principle. Unix got it right. But npm developers ran with it to an absurd extreme. Building a car? Sure, package the tires and the steering wheel separately. But also the bolts. The washers. The paint pigment. Each one gets its own globally unique name.&lt;/p&gt;

&lt;p&gt;The poster child here is &lt;code&gt;is-odd&lt;/code&gt;. A package that checks if a number is odd. The actual logic? &lt;code&gt;return n % 2 === 1;&lt;/code&gt;. That's it. A few lines. And it gets downloaded tens of millions of times a week. Oh, and it depends on &lt;code&gt;is-number&lt;/code&gt;. A package to check if something is a number. You can't make this up.&lt;/p&gt;

&lt;p&gt;The DRY principle ("Don't Repeat Yourself") was the justification. Fair enough. But nobody stopped to think about what it costs to burn a globally unique name on a one-liner. Stuff that should've stayed as a helper function in your codebase got registered in a shared global registry instead. One by one, the good names disappeared.&lt;/p&gt;

&lt;h3&gt;
  
  
  Typosquatting Made It Worse
&lt;/h3&gt;

&lt;p&gt;Then there's the security angle. Bad actors register names like &lt;code&gt;requesst&lt;/code&gt; or &lt;code&gt;py-requests&lt;/code&gt;, banking on someone's typo to slip malware into a build. Registry maintainers have to block these lookalikes preemptively. That means even more names get locked up as buffer zones, squeezing the pool of available names even further.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Just Reclaim Abandoned Names?
&lt;/h2&gt;

&lt;p&gt;Seems obvious, right? If a package hasn't been touched in a decade, free up the name and let someone else use it. Except people tried that. It went badly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The event-stream Disaster
&lt;/h3&gt;

&lt;p&gt;In 2018, someone offered to take over maintenance of &lt;code&gt;event-stream&lt;/code&gt;, a popular but neglected npm package. The original author handed it off. The new maintainer then quietly injected malware that targeted a specific Bitcoin wallet. Millions of downloads, all trusting the package because of its track record.&lt;/p&gt;

&lt;p&gt;When you inherit a name, you inherit the trust attached to it. That trust becomes a weapon.&lt;/p&gt;

&lt;h3&gt;
  
  
  The left-pad Meltdown
&lt;/h3&gt;

&lt;p&gt;March 2016. A developer named Azer Koçulu got into a fight with npm over a package name ("kik," which a messaging company wanted). npm sided with the company. Koçulu, furious, yanked all 270-something of his packages off the registry.&lt;/p&gt;

&lt;p&gt;One of them was &lt;code&gt;left-pad&lt;/code&gt;. Eleven lines of code. Pads the left side of a string. Trivial, right? Except Babel depended on it. React depended on it. Node.js depended on it. Builds broke everywhere. The JavaScript ecosystem ground to a halt over eleven lines.&lt;/p&gt;

&lt;p&gt;The takeaway was brutal: even a tiny, ancient, seemingly insignificant package might be holding up critical infrastructure somewhere. You can't just delete things.&lt;/p&gt;

&lt;p&gt;npm now restricts package deletion because of this. Once it's published, it stays.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Decides "Abandoned"?
&lt;/h3&gt;

&lt;p&gt;There's a more basic problem too. How do you tell the difference between a project that's abandoned and one that's just... done? A library that does its job and doesn't need updates? You'd have to contact the owner, review the code, check downstream dependencies. For millions of packages. On a volunteer basis. That's not happening. So names stay locked up, basically forever. Retired jersey numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Ecosystems, Three Philosophies
&lt;/h2&gt;

&lt;p&gt;The major language communities have taken very different approaches to this mess.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python and JavaScript: Tightening the Rules
&lt;/h3&gt;

&lt;p&gt;PyPI and npm started out as open markets. Publish whatever you want, name it whatever you want. Freedom. That era's over. Both registries now require two-factor auth. Python has PEP 541, a formal process for reclaiming names from dead projects. npm has similar policies.&lt;/p&gt;

&lt;p&gt;The free frontier turned into a city with zoning laws.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What's PEP 541?&lt;/strong&gt; A 2017 Python Enhancement Proposal that spells out how to handle name disputes on PyPI. It covers abandoned projects, trademark claims, and name squatting. Basically, it's the rulebook for who gets to keep a name.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Go: Skip the Registry Entirely
&lt;/h3&gt;

&lt;p&gt;Go did something different. No central registry at all. Your import path is just a URL: &lt;code&gt;github.com/someone/something&lt;/code&gt;. The domain name &lt;em&gt;is&lt;/em&gt; the namespace. Problem solved?&lt;/p&gt;

&lt;p&gt;Not quite. Repos get deleted. Accounts get nuked. Your build breaks because someone's GitHub disappeared. So Google built a proxy (&lt;code&gt;proxy.golang.org&lt;/code&gt;) that caches everything centrally. They ended up with a hybrid: names are decentralized, but the data is backed up in one place.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zooko's Triangle&lt;/strong&gt; says you can pick two out of three: human-readable names, globally unique names, or decentralized names. You can't have all three. Go tried to get around it. They got two and a half.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Rust: Once Published, Published Forever
&lt;/h3&gt;

&lt;p&gt;Rust came late enough to learn from everyone else's mistakes. Cargo's rule is simple: you can't delete a published package. Period. They also chose not to add user scopes (&lt;code&gt;@user/package&lt;/code&gt;). The whole namespace is shared, like a public park, and it's managed accordingly.&lt;/p&gt;

&lt;p&gt;The thinking: if one person walks away from a project, the community can keep it alive. Your bus factor goes up. "Digital urban planning," essentially.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tragedy of the Commons, Software Edition
&lt;/h2&gt;

&lt;p&gt;Here's the pattern: a shared resource (the namespace) is open to everyone, so individuals grab names "just in case," and the collective suffers. Classic commons problem.&lt;/p&gt;

&lt;p&gt;What's weird is how differently we treat package names versus domain names. Domain names are private property. People buy and sell them openly. A good .com can fetch six or seven figures. But try selling a PyPI package name and the community will eat you alive.&lt;/p&gt;

&lt;p&gt;There's a deep-seated belief in open source that names belong to everyone. They're commons, not assets. Selling one feels like a betrayal. So the "if you don't need it, sell it" pressure valve that works for domains doesn't exist here. Names just sit there. Unused. Unreleased. Stuck.&lt;/p&gt;

&lt;p&gt;And yet we keep chasing flat, unscoped names when &lt;code&gt;@user/package&lt;/code&gt; exists as a solution. Why? Because &lt;code&gt;requests&lt;/code&gt; feels like a brand. &lt;code&gt;@some-person/requests&lt;/code&gt; doesn't. We want the prime real estate, not a unit in a subdivision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next?
&lt;/h2&gt;

&lt;p&gt;Name scarcity is only going to get worse. But a couple of ideas are floating around.&lt;/p&gt;

&lt;p&gt;One is AI-driven resolution. Maybe humans don't need to remember package names at all. You describe what you need, and an AI pulls the right package by hash or by function signature. Names become metadata, not identifiers.&lt;/p&gt;

&lt;p&gt;Another is reputation-based allocation. Instead of first-come-first-served, names could flow toward maintainers with track records. Trust scores, contribution history, community endorsement. Something more fluid.&lt;/p&gt;

&lt;p&gt;Both of these are speculative. For now, we're stuck with the system we've got: a flat namespace that's mostly full, governed by rules that were written after things broke.&lt;/p&gt;

&lt;p&gt;Next time you come up with the perfect package name, check the registry first. Odds are, someone beat you to it in 2013. Their repo has one file in it. And there's nothing you can do about it.&lt;/p&gt;

&lt;p&gt;Maybe that's fine. Maybe the era of human-readable names as the primary interface is ending anyway. The next "great name" you come up with might not be for a human reader. It might be a prompt.&lt;/p&gt;

&lt;p&gt;I'm not sure how I feel about that yet.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>npm</category>
      <category>python</category>
    </item>
    <item>
      <title>From CLI to GitHub Bot: Building a Code Management AI for Python</title>
      <dc:creator>DaisukeYoda</dc:creator>
      <pubDate>Sat, 07 Feb 2026 06:58:40 +0000</pubDate>
      <link>https://dev.to/daisukeyoda/from-cli-to-github-bot-building-a-code-management-ai-for-python-7nk</link>
      <guid>https://dev.to/daisukeyoda/from-cli-to-github-bot-building-a-code-management-ai-for-python-7nk</guid>
      <description>&lt;p&gt;Four months ago, I built a CLI tool to scan my own messy Python code.&lt;/p&gt;

&lt;p&gt;Today it's a GitHub bot that audits entire repositories. Here's how it evolved and what I learned at each stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 1: pyscn CLI — Measure First
&lt;/h2&gt;

&lt;p&gt;It started with a frustration. I was vibe-coding fast with AI tools, but my codebase was getting worse. I needed numbers, not feelings.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;pyscn&lt;/a&gt; — a static analysis engine in Go with tree-sitter. It scans Python code and gives you a &lt;strong&gt;Health Score&lt;/strong&gt; (0–100) based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cyclomatic complexity&lt;/li&gt;
&lt;li&gt;Dead code&lt;/li&gt;
&lt;li&gt;Code clones (copy-paste detection)&lt;/li&gt;
&lt;li&gt;Module coupling
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx pyscn analyze &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command. Full HTML report.&lt;/p&gt;

&lt;p&gt;I wrote about the details here: &lt;a href="https://dev.to/daisukeyoda/pyscn-the-code-quality-analyzer-for-vibe-coders-18hk"&gt;Pyscn: The Code Quality Analyzer for Vibe Coders&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What surprised me
&lt;/h3&gt;

&lt;p&gt;I ran pyscn on Flask and FastAPI to see how "clean" famous open-source projects actually are. The results were eye-opening — even well-maintained projects have hidden complexity.&lt;/p&gt;

&lt;p&gt;Full breakdown: &lt;a href="https://dev.to/daisukeyoda/how-clean-is-famous-open-source-code-i-measured-flask-and-fastapi-2k09"&gt;How Clean Is Famous Open Source Code? I Measured Flask and FastAPI.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2: MCP Server — Let AI Use It
&lt;/h2&gt;

&lt;p&gt;The CLI worked, but I wanted Claude and other AI tools to use pyscn directly during coding sessions. So I wrapped it as an MCP server.&lt;/p&gt;

&lt;p&gt;Now your AI assistant can check code quality in real-time while you're working.&lt;/p&gt;

&lt;p&gt;Details: &lt;a href="https://dev.to/daisukeyoda/analyzing-python-code-quality-via-mcp-4oi3"&gt;Analyzing Python Code Quality via MCP&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 3: pyscn-bot — Automate Everything
&lt;/h2&gt;

&lt;p&gt;The CLI and MCP were useful, but they required someone to &lt;em&gt;remember&lt;/em&gt; to run them. The real problem is: &lt;strong&gt;nobody audits the codebase regularly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/marketplace/pyscn-bot" rel="noopener noreferrer"&gt;pyscn-bot&lt;/a&gt; — a GitHub App that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekly audits&lt;/strong&gt; your full repository and posts findings as GitHub Issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviews PRs&lt;/strong&gt; with architecture-aware comments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports in 8 languages&lt;/strong&gt; — English, Japanese, Chinese, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero config&lt;/strong&gt; — install and it just works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference from other code review bots: pyscn-bot doesn't just look at diffs. It analyzes your &lt;em&gt;entire&lt;/em&gt; codebase every time.&lt;/p&gt;

&lt;p&gt;Full writeup: &lt;a href="https://dev.to/daisukeyoda/pyscn-bot-a-periodic-code-audit-ai-agent-for-vibe-coders-1g6m"&gt;pyscn-bot: A Periodic Code Audit AI Agent for Vibe Coders&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;pyscn-bot is launching on Product Hunt today:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.producthunt.com/posts/pyscn-bot" rel="noopener noreferrer"&gt;Pyscn Bot on Product Hunt&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you vibe-code in Python, try the Health Score on your repo. It's free.&lt;/p&gt;

&lt;p&gt;I'd love to hear what you think — drop a comment here or find me on &lt;a href="https://x.com/pyscn_official" rel="noopener noreferrer"&gt;X (@pyscn_official)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How Clean Is Famous Open Source Code? I Measured Flask and FastAPI.</title>
      <dc:creator>DaisukeYoda</dc:creator>
      <pubDate>Wed, 21 Jan 2026 12:21:09 +0000</pubDate>
      <link>https://dev.to/daisukeyoda/how-clean-is-famous-open-source-code-i-measured-flask-and-fastapi-2k09</link>
      <guid>https://dev.to/daisukeyoda/how-clean-is-famous-open-source-code-i-measured-flask-and-fastapi-2k09</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%2F5461uv7lyibqhq61u7rm.jpg" 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%2F5461uv7lyibqhq61u7rm.jpg" alt=" "&gt;&lt;/a&gt;The engineers behind famous OSS are elite. No question.&lt;/p&gt;

&lt;p&gt;But even well-maintained codebases grow — and growth has a cost.&lt;/p&gt;

&lt;p&gt;Does "famous" still mean "high quality" after years of evolution?&lt;/p&gt;

&lt;p&gt;I pointed a static analyzer at Flask and FastAPI to find out.&lt;/p&gt;

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

&lt;p&gt;I ran &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;pyscn&lt;/a&gt; — an open-source Python static analyzer — on both frameworks. Unlike traditional linters that focus on style, pyscn measures structural quality: how complex the functions are, how tangled the classes are, how much code is duplicated, whether modules import each other in circles, whether any code is never called, and an overall health score.&lt;/p&gt;

&lt;p&gt;What makes pyscn useful for this kind of comparison is that it outputs everything in a single run. No need to combine multiple tools or normalize different scoring systems. Same metrics, same scale, same conditions.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ludo-technologies" rel="noopener noreferrer"&gt;
        ludo-technologies
      &lt;/a&gt; / &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;
        pyscn
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An Intelligent Python Code Quality Analyzer
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;

  
  
  &lt;img alt="pyscn" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fludo-technologies%2Fpyscn%2Fassets%2Flogo-light.svg" width="320"&gt;

&lt;p&gt;&lt;strong&gt;A code quality analyzer for Python vibe coders.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Building with Cursor, Claude, or ChatGPT? pyscn performs structural analysis to keep your codebase maintainable.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to/daisukeyoda/pyscn-the-code-quality-analyzer-for-vibe-coders-18hk" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/f1367e8ac54cb6ec77443f5c0097905c1b7c240bfd7389452343467303377f79/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6465762e746f2d41727469636c652d3041304130413f7374796c653d666c61742d737175617265266c6f676f3d6465762e746f" alt="Article"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/pyscn/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ca3ac9d9b49e245b10bfc2bb94e88a10ddca4e26007f3f05e42809cc82fb2d88/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f707973636e3f7374796c653d666c61742d737175617265266c6f676f3d70797069" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/pyscn/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3ccca71bd573703e7031133e2aa1cc7621b12912d89bdb6ff074caa5bf13b33b/68747470733a2f2f696d672e736869656c64732e696f2f707970692f646d2f707973636e3f7374796c653d666c61742d737175617265266c6f676f3d70797069266c6162656c3d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://go.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0426285d6a4b2298216ae0a6301c5b9613479aff9c9585955876ade19712059a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f676f2d6d6f642f676f2d76657273696f6e2f6c75646f2d746563686e6f6c6f676965732f707973636e3f7374796c653d666c61742d737175617265266c6f676f3d676f" alt="Go"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ludo-technologies/pyscn/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9234a8aea68ae9e90e440417a75dd487e0cc248cdb5e92804b3a01acc295a71e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6c75646f2d746563686e6f6c6f676965732f707973636e3f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Working with JavaScript/TypeScript? Check out &lt;a href="https://github.com/ludo-technologies/jscan" rel="noopener noreferrer"&gt;jscan&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Run analysis without installation&lt;/span&gt;
uvx pyscn@latest analyze &lt;span class="pl-c1"&gt;.&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or&lt;/span&gt;
pipx run pyscn analyze &lt;span class="pl-c1"&gt;.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;

  
    
    

    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🔍 &lt;strong&gt;CFG-based dead code detection&lt;/strong&gt; – Find unreachable code after exhaustive if-elif-else chains&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;Multi-algorithm clone detection (Type 1-4)&lt;/strong&gt; – Identify refactoring opportunities with LSH acceleration&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Coupling metrics (CBO)&lt;/strong&gt; – Track architecture quality and module dependencies&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Cyclomatic complexity analysis&lt;/strong&gt; – Spot functions that need breaking down&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;100,000+ lines/sec&lt;/strong&gt; • Built with Go + tree-sitter&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;MCP Integration&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Run pyscn analyses straight from AI coding assistants via the Model Context Protocol (MCP). The bundled &lt;code&gt;pyscn-mcp&lt;/code&gt; server exposes the same tools used in the CLI to Claude Code, Cursor, ChatGPT, and other MCP clients.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;MCP Use Cases&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;You can interact with…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;I grabbed the latest releases (Flask 3.1.1, FastAPI 0.115.12) and analyzed only the core source. No tests or docs — just the real code.&lt;/p&gt;

&lt;p&gt;Here's what 71 files told me:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;FastAPI&lt;/th&gt;
&lt;th&gt;Flask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Health Score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;68 (C)&lt;/td&gt;
&lt;td&gt;77 (B)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Avg Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.07&lt;/td&gt;
&lt;td&gt;7.57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Duplication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.2%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coupling (CBO)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.23&lt;/td&gt;
&lt;td&gt;1.39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Circular Deps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;94.3%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&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%2F7rto734it2g7twym20wm.jpg" 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%2F7rto734it2g7twym20wm.jpg" alt="FastAPI pyscn report"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These numbers are raw output from a general-purpose tool — not tuned for each framework's specific goals or context.&lt;/p&gt;

&lt;p&gt;That said, the architecture scores speak for themselves: both above 94%. The health scores look modest (C and B), but that's what happens with large, mature codebases. Look at the individual metrics — low coupling, minimal duplication, almost no dead code — and you can tell these projects are well-maintained.&lt;/p&gt;

&lt;p&gt;Let's look at what's behind each number.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Numbers Actually Mean
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complexity: The Cost of Features
&lt;/h3&gt;

&lt;p&gt;FastAPI's most complex function scores 28 on cyclomatic complexity. It's responsible for automatic OpenAPI schema generation — a feature Flask doesn't include in core.&lt;/p&gt;

&lt;p&gt;Flask has its own complex spots, like &lt;code&gt;find_app_by_string&lt;/code&gt; at 22. But the complexity serves different purposes: one builds API specifications automatically, the other handles CLI app discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Coupling: The OpenAPI Tax
&lt;/h3&gt;

&lt;p&gt;FastAPI has 3 classes with high coupling (CBO &amp;gt;= 8). The highest is 12 — a class that needs to know about schemas, references, responses, headers, and more. That's what happens when you build OpenAPI specs programmatically.&lt;/p&gt;

&lt;p&gt;Flask's maximum coupling is 6, from the core &lt;code&gt;Flask&lt;/code&gt; class itself.&lt;/p&gt;

&lt;p&gt;This isn't a design flaw. OpenAPI-first architecture requires components to be aware of each other. FastAPI chose that trade-off deliberately.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Circular Dependency Surprise
&lt;/h3&gt;

&lt;p&gt;Here's where FastAPI actually wins. &lt;strong&gt;Zero circular dependencies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Flask has one cycle involving 6 modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blueprints ←→ sansio.blueprints
blueprints  → sansio.scaffold
debughelpers → blueprints
debughelpers → sansio.app
sansio.app  → templating
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is 14 years of organic growth. It works, but it makes deep refactoring harder. Newer codebases benefit from hindsight. FastAPI's clean dependency graph reflects lessons learned from predecessors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Duplication: Compatibility Costs
&lt;/h3&gt;

&lt;p&gt;FastAPI's 2.2% duplication lives mostly in &lt;code&gt;_compat&lt;/code&gt; modules — supporting both Pydantic v1 and v2.&lt;/p&gt;

&lt;p&gt;Flask: 0%. Minimal surface area means less to duplicate.&lt;/p&gt;

&lt;p&gt;Supporting multiple library versions costs code cleanliness. Sometimes that's worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Lesson
&lt;/h2&gt;

&lt;p&gt;These numbers don't pick a winner. They reveal trade-offs.&lt;/p&gt;

&lt;p&gt;FastAPI's higher complexity and coupling aren't accidents. They're the cost of automatic OpenAPI docs and type-driven validation baked into the core. The duplication exists to support multiple Pydantic versions. Every metric tells a story of deliberate choices.&lt;/p&gt;

&lt;p&gt;Flask takes the opposite path. Lower complexity because the core stays minimal. Lower coupling because features live in extensions. The circular dependency is 14 years of organic growth. Not ideal, but stable.&lt;/p&gt;

&lt;p&gt;Both frameworks have zero dead code. Both are maintained by teams who know exactly what they're doing.&lt;/p&gt;

&lt;p&gt;But that's the point. Even codebases this well-maintained have spots worth revisiting. A circular dependency here, gradual coupling there. Tools like pyscn make these patterns visible, giving even experienced engineers a fresh perspective on code they see every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Your Code?
&lt;/h2&gt;

&lt;p&gt;Want to see where your project lands? No installation needed. Just use the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx pyscn@latest analyze &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&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%2Fzetg3zfzc49bif69fq2j.jpg" 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%2Fzetg3zfzc49bif69fq2j.jpg" alt="how-to-use-pyscn"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might find circular dependencies you didn't know about. Or coupling that's grown out of control. Or hopefully confirmation that your architecture is solid.&lt;/p&gt;

&lt;p&gt;The goal isn't perfection. It's awareness.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;pyscn&lt;/a&gt;. Analysis performed January 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>pyscn-bot: A Periodic Code Audit AI Agent for Vibe Coders</title>
      <dc:creator>DaisukeYoda</dc:creator>
      <pubDate>Wed, 07 Jan 2026 13:19:12 +0000</pubDate>
      <link>https://dev.to/daisukeyoda/pyscn-bot-a-periodic-code-audit-ai-agent-for-vibe-coders-1g6m</link>
      <guid>https://dev.to/daisukeyoda/pyscn-bot-a-periodic-code-audit-ai-agent-for-vibe-coders-1g6m</guid>
      <description>&lt;h2&gt;
  
  
  In the Age of AI-Generated Code, How Are You Managing Quality?
&lt;/h2&gt;

&lt;p&gt;Cursor, Claude Code, ChatGPT-the arrival of AI coding assistants has dramatically accelerated development speed. We now live in an era where you can build "something that works" in just minutes.&lt;/p&gt;

&lt;p&gt;This development style is called "Vibe Coding." It's an approach where you interact with AI to generate code quickly, without overthinking the finer points of design.&lt;/p&gt;

&lt;p&gt;However, Vibe Coding has its pitfalls.&lt;/p&gt;

&lt;p&gt;As your project grows, have you noticed your codebase becoming "sluggish," "hard to navigate," or "full of similar code scattered everywhere"? AI-generated code works, but it often carries structural problems beneath the surface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pyscn.ludo-tech.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;pyscn-bot&lt;/strong&gt;&lt;/a&gt; was created to solve this problem.&lt;/p&gt;

&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%2Fwm353cda594rwgb97pkj.jpg" 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%2Fwm353cda594rwgb97pkj.jpg" alt=" " width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is pyscn-bot?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pyscn.ludo-tech.org/" rel="noopener noreferrer"&gt;pyscn-bot&lt;/a&gt; is an AI agent that periodically audits your entire Python codebase. Simply install it on your GitHub repository, and it will automatically detect code quality issues on a weekly (or daily) basis, reporting them as GitHub Issues.&lt;/p&gt;

&lt;p&gt;Although it was just officially released in January 2026, it has already generated buzz on Hacker News, with reactions like "This is genuinely useful for reviewing AI-generated code" and "Essential for maintaining architectural health."&lt;/p&gt;

&lt;p&gt;Official website: &lt;a href="https://pyscn.ludo-tech.org" rel="noopener noreferrer"&gt;https://pyscn.ludo-tech.org/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Need pyscn-bot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Limitations of Traditional AI Code Review Bots
&lt;/h3&gt;

&lt;p&gt;There are many AI code review tools on the market. However, most of them are simply "LLM wrappers" that pass PR diffs to an LLM.&lt;/p&gt;

&lt;p&gt;LLM wrappers have a fundamental limitation: they only examine the changed diff, making it impossible to evaluate the overall health of the codebase. Individual PRs may look fine, but the architecture can gradually collapse as changes accumulate-and these tools cannot detect that.&lt;/p&gt;

&lt;h3&gt;
  
  
  pyscn-bot's Approach
&lt;/h3&gt;

&lt;p&gt;pyscn-bot takes a fundamentally different approach.&lt;/p&gt;

&lt;p&gt;Its proprietary static analysis engine, "pyscn," scans the entire codebase and &lt;strong&gt;quantitatively measures&lt;/strong&gt; complexity, duplication rates, dependencies, and more. This is algorithmic measurement, not LLM-based guesswork.&lt;/p&gt;

&lt;p&gt;On top of that, AI interprets the measurement results and generates specific improvement suggestions. This enables evidence-based recommendations like: "This function has a complexity score of 23, far exceeding the recommended threshold of 10. Consider splitting it into the following three functions."&lt;/p&gt;

&lt;p&gt;You can see details: &lt;a href="https://pyscn.ludo-tech.org/how-it-works/" rel="noopener noreferrer"&gt;How it works&lt;/a&gt;&lt;/p&gt;

&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%2Fjtzx52tgvexfkhjn85gl.jpg" 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%2Fjtzx52tgvexfkhjn85gl.jpg" alt=" " width="800" height="647"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What pyscn-bot Detects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overly Complex Functions
&lt;/h3&gt;

&lt;p&gt;AI writes code that works, but it doesn't necessarily write simple code. Functions with 10+ levels of nested conditionals, monolithic functions exceeding 100 lines—such code is hard to test and becomes a breeding ground for bugs.&lt;/p&gt;

&lt;p&gt;pyscn-bot measures cyclomatic complexity and identifies functions that need to be split.&lt;/p&gt;

&lt;h3&gt;
  
  
  Duplicate Code
&lt;/h3&gt;

&lt;p&gt;Have you ever thought "I've built something similar before" while having AI generate new code? In Vibe Coding, subtle variations of the same logic tend to proliferate throughout the codebase.&lt;/p&gt;

&lt;p&gt;pyscn-bot uses the APTED (tree edit distance) algorithm to detect structurally similar code. Even if variable names differ, it won't miss code with identical logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dead Code
&lt;/h3&gt;

&lt;p&gt;When you modify functionality, do you forget to remove the old code? AI adds new code, but it doesn't delete code that's no longer needed.&lt;/p&gt;

&lt;p&gt;pyscn-bot constructs a Control Flow Graph (CFG) to identify unreachable code and unused functions or variables. It can discover logic-level issues that text-based linters would miss.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tightly Coupled Architecture
&lt;/h3&gt;

&lt;p&gt;Have you ever felt that "this change has a bigger impact than I expected"? When dependencies between modules become complex, small changes can ripple to unexpected places.&lt;/p&gt;

&lt;p&gt;pyscn-bot measures coupling metrics (CBO) and visualizes the health of your architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy of Periodic Auditing
&lt;/h2&gt;

&lt;p&gt;The defining feature of pyscn-bot is its "periodic auditing" philosophy.&lt;/p&gt;

&lt;p&gt;PR-by-PR reviews only show whether individual changes are problematic. However, 100 seemingly fine PRs can accumulate to degrade the entire codebase. This phenomenon is known as "technical debt accumulation."&lt;/p&gt;

&lt;p&gt;pyscn-bot scans your entire repository weekly (or daily on the PRO plan) and creates reports as GitHub Issues. This enables you to monitor degradation that's difficult to notice during day-to-day development.&lt;/p&gt;

&lt;p&gt;Automating "health checkups" for your codebase—that's the value pyscn-bot delivers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power of the "pyscn" Static Analysis Engine
&lt;/h2&gt;

&lt;p&gt;The static analysis engine "pyscn" that powers pyscn-bot is built with Go and Tree-sitter.&lt;/p&gt;

&lt;p&gt;Processing speed exceeds &lt;strong&gt;100,000 lines per second&lt;/strong&gt;. Even large codebases can be analyzed in seconds. This speed is what makes periodic full-repository scans practical.&lt;/p&gt;

&lt;p&gt;pyscn is open source and can be used locally. Simply run &lt;code&gt;uvx pyscn analyze .&lt;/code&gt; from the command line to generate an HTML report.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;https://github.com/ludo-technologies/pyscn&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration with AI Assistants
&lt;/h2&gt;

&lt;p&gt;Beyond pyscn-bot, pyscn includes a built-in MCP (Model Context Protocol) server. This allows AI coding assistants like Claude Code and Cursor to directly invoke pyscn's analysis capabilities.&lt;/p&gt;

&lt;p&gt;AI detects issues, AI proposes fixes, AI executes refactoring—a fully automated code quality improvement workflow becomes possible.&lt;/p&gt;

&lt;p&gt;Build fast with Vibe Coding, ensure quality with pyscn. This cycle may become the defining development style of the AI era.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing Plans
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Weekly code audits are available for free. Try it on your own repository first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PRO ($10/month)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Daily audits, per-PR code reviews, and advanced analysis models. Includes a 14-day free trial.&lt;/p&gt;

&lt;p&gt;Weekly audits are completely free. You can visualize the health of your codebase at no cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Message to Vibe Coders
&lt;/h2&gt;

&lt;p&gt;The speed of writing code with AI will only increase from here. But as speed increases, so does the importance of quality management.&lt;/p&gt;

&lt;p&gt;Shifting from "it works, so it's fine" to "it's maintainable, so it's fine"—this perspective is the key to long-term project success.&lt;/p&gt;

&lt;p&gt;pyscn-bot automatically monitors code quality without compromising the freedom of Vibe Coding. Having something that reports issues you wouldn't notice on a weekly basis—there's nothing more reassuring.&lt;/p&gt;

&lt;p&gt;Please try installing it on your repository and give your codebase a "health checkup."&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Official website: &lt;a href="https://pyscn.ludo-tech.org" rel="noopener noreferrer"&gt;https://pyscn.ludo-tech.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub: &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;https://github.com/ludo-technologies/pyscn&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developer: &lt;a href="https://www.ludo-tech.org" rel="noopener noreferrer"&gt;https://www.ludo-tech.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Managing the Quality of AI-Generated Python Code</title>
      <dc:creator>DaisukeYoda</dc:creator>
      <pubDate>Fri, 28 Nov 2025 17:10:13 +0000</pubDate>
      <link>https://dev.to/daisukeyoda/managing-the-quality-of-ai-generated-python-code-48pe</link>
      <guid>https://dev.to/daisukeyoda/managing-the-quality-of-ai-generated-python-code-48pe</guid>
      <description>&lt;p&gt;AI coding is ridiculously convenient.&lt;/p&gt;

&lt;p&gt;When you're using Claude or Cursor, writing code from scratch starts to feel pointless. Give it instructions, and working code comes out. It even writes tests for you. Development speed has definitely improved.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://research.google/blog/ai-in-software-engineering-at-google-progress-and-the-path-ahead/" rel="noopener noreferrer"&gt;Google's research&lt;/a&gt;, &lt;strong&gt;50% of code in the industry is now generated by AI&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://research.google/blog/ai-in-software-engineering-at-google-progress-and-the-path-ahead/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-research2023-media%2Fimages%2FOpen_Graph.width-800.format-jpeg.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://research.google/blog/ai-in-software-engineering-at-google-progress-and-the-path-ahead/" rel="noopener noreferrer" class="c-link"&gt;
            AI in software engineering at Google: Progress and the path ahead
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gstatic.com%2Fimages%2Fbranding%2Fgoogleg_gradient%2F1x%2Fgoogleg_gradient_standard_20dp.png" width="20" height="20"&gt;
          research.google
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;In this article, I'll introduce &lt;strong&gt;two incredibly useful tools&lt;/strong&gt; that I use when programming with AI coding agents.&lt;/p&gt;

&lt;p&gt;Rather than leaving everything to AI, combining these tools dramatically improves code maintainability. And the larger your codebase becomes, the more AI agents can demonstrate their true potential.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Static Analysis Tools Are Necessary
&lt;/h3&gt;

&lt;p&gt;Code written by AI still needs maintenance. As projects grow larger, AI struggles to grasp everything. And &lt;strong&gt;the worse the code quality, the worse AI's capabilities become&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AI has a constraint called the context window. There's a limit to how much code it can read at once. That's precisely why codebases need to be "readable" and "well-organized."&lt;/p&gt;

&lt;p&gt;Specifically, here's what happens with poor-quality codebases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When &lt;strong&gt;duplicate code&lt;/strong&gt; is scattered everywhere, AI repeatedly suggests similar fixes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overly complex functions&lt;/strong&gt; are difficult even for AI to understand, leading to off-target suggestions&lt;/li&gt;
&lt;li&gt;When &lt;strong&gt;dependencies become spaghetti-like&lt;/strong&gt;, AI misjudges the impact scope of changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finding these problems manually is exhausting. However, static analysis tools can detect them &lt;strong&gt;mechanically, consistently, and quickly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's why we use &lt;strong&gt;static analysis tools&lt;/strong&gt; to maintain codebase quality. By eliminating problems that can be checked mechanically, AI can focus on more essential work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Ruff: The Static Analysis Tool
&lt;/h3&gt;

&lt;p&gt;The Python development ecosystem was once a battlefield of competing linters.&lt;/p&gt;

&lt;p&gt;Flake8 for code style, isort for import ordering, pydocstyle for docstrings, Bandit for security checks... Each tool needed to be installed separately, versions managed individually, and configuration file conflicts caused endless headaches. It wasn't uncommon to be exhausted just from environment setup.&lt;/p&gt;

&lt;p&gt;Ruff ended this chaos.&lt;/p&gt;

&lt;p&gt;Ruff comprehensively incorporates the functionality of these existing major tools. Moreover, it's not just a wrapper (a mere collection). Since the internal logic is reimplemented from scratch in Rust, it not only unifies tools but operates at astonishing speed.&lt;/p&gt;

&lt;p&gt;"Tool management overhead" and "execution wait time." Ruff solves both of these problems—which had become bottlenecks for development speed in the AI era—with a single tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Pyscn: A Code Design Diagnostic Tool for the AI Era
&lt;/h3&gt;

&lt;p&gt;Ruff is certainly excellent. However, its scope is limited to &lt;strong&gt;syntax-level&lt;/strong&gt; checks. Unused imports, naming convention violations, improper indentation—these are important, but determining whether a codebase is truly "healthy" requires deeper analysis.&lt;/p&gt;

&lt;p&gt;Code generated by AI has common problems. &lt;strong&gt;Similar logic gets copied everywhere&lt;/strong&gt;, &lt;strong&gt;functions bloat and become complex&lt;/strong&gt;, and &lt;strong&gt;inter-module dependencies become spaghetti-like&lt;/strong&gt;. These issues occur even when all Ruff rules pass.&lt;/p&gt;

&lt;p&gt;This is where &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;pyscn&lt;/a&gt; comes in.&lt;/p&gt;

&lt;p&gt;pyscn is a static analysis tool that analyzes the &lt;strong&gt;structural quality&lt;/strong&gt; of Python code. Built with Go and tree-sitter, it processes &lt;strong&gt;over 100,000 lines per second&lt;/strong&gt; while providing the following advanced analyses:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Analysis&lt;/th&gt;
&lt;th&gt;What It Reveals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cyclomatic Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detects functions that have become difficult to understand due to excessive branches and loops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dead Code Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Finds unreachable code after &lt;code&gt;return&lt;/code&gt; statements and dead branches after exhaustive if-elif-else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Clone Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detects copy-pasted similar code using tree edit distance and suggests refactoring candidates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coupling Metrics (CBO)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visualizes dependencies between classes and warns about tightly coupled modules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If Ruff corrects "how code is written," pyscn diagnoses "how code is designed." They don't compete—they &lt;strong&gt;complement&lt;/strong&gt; each other.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Execute instantly without installation&lt;/span&gt;
uvx pyscn analyze &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With just this, an HTML report is generated, visualizing the quality of your entire codebase.&lt;/p&gt;
&lt;h3&gt;
  
  
  Integration with AI Coding Tools: Unleashing pyscn's True Potential
&lt;/h3&gt;

&lt;p&gt;pyscn's true value emerges not just from standalone use, but from &lt;strong&gt;combining it with AI coding tools&lt;/strong&gt;. By passing diagnostic results to AI, you can automate complex refactoring all at once.&lt;/p&gt;
&lt;h4&gt;
  
  
  Use Case 1: Quality Check with Claude Code Slash Commands → Instant Refactoring
&lt;/h4&gt;

&lt;p&gt;In Claude Code, you can define custom slash commands simply by placing markdown files in &lt;code&gt;.claude/commands/&lt;/code&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="c"&gt;&amp;lt;!-- .claude/commands/check-quality.md --&amp;gt;&lt;/span&gt;
Use the uvx pyscn@latest check src/ command to verify code quality. I want to refactor problematic code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With this prepared, just typing &lt;code&gt;/check-quality&lt;/code&gt; in Claude Code executes pyscn diagnostics and AI refactoring suggestions in one shot.&lt;/p&gt;

&lt;p&gt;Detect high-complexity functions → Suggest function splitting → Apply on the spot. All of this completes with a single conversation.&lt;/p&gt;
&lt;h4&gt;
  
  
  Use Case 2: Detect Code Clones via MCP → Consolidate
&lt;/h4&gt;

&lt;p&gt;In Cursor and Claude Desktop, you can call pyscn directly through MCP (Model Context Protocol).&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pyscn-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pyscn-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After configuration, just give this instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find duplicate code and extract it into a common function"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;pyscn detects similar code using tree edit distance, and AI makes consolidation suggestions based on the results. Clone pairs found with 92% similarity are transformed into a single reusable function.&lt;/p&gt;
&lt;h4&gt;
  
  
  Use Case 3: Quality Gate in CI/CD
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GitHub Actions&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pipx run pyscn check --max-complexity 15 .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Stop the build when complexity exceeds the threshold. Even for AI-generated code, you can ensure quality through mechanical rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  Conclusion: The Future of pyscn
&lt;/h3&gt;

&lt;p&gt;pyscn is currently under &lt;strong&gt;active maintenance&lt;/strong&gt;. We continuously release bug fixes and feature improvements, and actively respond to GitHub Issues and PRs.&lt;/p&gt;

&lt;p&gt;For future development, we're preparing &lt;strong&gt;automatic review and fix functionality using LLMs&lt;/strong&gt;. pyscn detects problem areas, AI automatically analyzes them and presents fix proposals—we're aiming for a world where humans just approve the suggestions.&lt;/p&gt;

&lt;p&gt;Additionally, we're actively developing &lt;strong&gt;&lt;a href="https://github.com/ludo-technologies/jscan" rel="noopener noreferrer"&gt;jscan&lt;/a&gt;&lt;/strong&gt;, a sister tool for JavaScript/TypeScript. We'll bring the same structural analysis as pyscn to frontend development.&lt;/p&gt;



&lt;p&gt;In an era where AI writes code, &lt;strong&gt;mechanisms to protect code quality&lt;/strong&gt; become more important than ever. Use Ruff to organize syntax, use pyscn to diagnose design. With this two-tier approach, keep your codebase healthy.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx pyscn analyze &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;First, try it on your project.&lt;/p&gt;

&lt;p&gt;If you like it, please give us a Star on the &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;. Contributions via Issues and Pull Requests are also very welcome!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;See also:&lt;/strong&gt; For more details on pyscn, check out this article:&lt;br&gt;
  &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/daisukeyoda" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3558584%2Fb9054d02-d968-4686-9cd0-9e0f9eb84d76.png" alt="daisukeyoda"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/daisukeyoda/managing-the-quality-of-ai-generated-python-code-561c-temp-slug-4734630" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Managing the Quality of AI-Generated Python Code&lt;/h2&gt;
      &lt;h3&gt;DaisukeYoda ・ &lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cli&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tooling&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>python</category>
      <category>ai</category>
      <category>cli</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Analyzing Python Code Quality via MCP</title>
      <dc:creator>DaisukeYoda</dc:creator>
      <pubDate>Sat, 18 Oct 2025 23:51:41 +0000</pubDate>
      <link>https://dev.to/daisukeyoda/analyzing-python-code-quality-via-mcp-4oi3</link>
      <guid>https://dev.to/daisukeyoda/analyzing-python-code-quality-via-mcp-4oi3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I recently released &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;pyscn&lt;/a&gt;, a Python code quality analyzer. The response has been incredible - we reached 850 stars on GitHub within just two weeks, and PyPI statistics show it's being actively used by many developers. I'm deeply grateful to everyone who uses pyscn and to all the contributors.&lt;/p&gt;

&lt;p&gt;Today, I'm excited to announce pyscn version 1.2.0, which introduces MCP (Model Context Protocol) support - a highly requested feature. This integration allows AI assistants to analyze Python code quality directly. (Special thanks to qinsehm1128 for implementing this feature!)&lt;/p&gt;

&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%2Fexuncy5h0em3t4il837o.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%2Fexuncy5h0em3t4il837o.png" alt="pyscn MCP sample output" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Setting up pyscn MCP is straightforward.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Claude Code&lt;/strong&gt; users, you can add the MCP server with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add pyscn-mcp uvx &lt;span class="nt"&gt;--&lt;/span&gt; pyscn-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For other MCP clients like Cursor, add the following to your config file (e.g., &lt;code&gt;~/.config/claude-desktop/config.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pyscn-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pyscn-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"PYSCN_CONFIG"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/.pyscn.toml"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Once configured, simply ask your AI assistant things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Analyze the code quality of the app/ directory"&lt;/li&gt;
&lt;li&gt;"Find duplicate code and help me refactor it"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude or ChatGPT will invoke the MCP tools to analyze and help refactor your code.&lt;/p&gt;

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

&lt;p&gt;pyscn MCP currently provides the following tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;analyze_code&lt;/strong&gt; - Comprehensive code quality analysis (all analyses at once)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;check_complexity&lt;/strong&gt; - Cyclomatic complexity analysis (McCabe complexity, nesting depth)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;detect_clones&lt;/strong&gt; - Code clone detection (APTED + LSH, Type 1-4 clones)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;check_coupling&lt;/strong&gt; - Class coupling analysis (CBO metrics)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;find_dead_code&lt;/strong&gt; - Dead code detection (CFG-based, unreachable code)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;get_health_score&lt;/strong&gt; - Code health score (0-100 points, grades A-F)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Give pyscn MCP a try and integrate code quality analysis into your development workflow. Clean code design makes AI-assisted coding far more efficient.&lt;/p&gt;

&lt;p&gt;If you have feedback, please share it via comments, X (Twitter), or GitHub issues. Real-world usage feedback is invaluable for improving the product.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;Article: &lt;a href="https://dev.to/daisukeyoda/pyscn-the-code-quality-analyzer-for-vibe-coders-18hk"&gt;https://dev.to/daisukeyoda/pyscn-the-code-quality-analyzer-for-vibe-coders-18hk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;https://github.com/ludo-technologies/pyscn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/pyscn/" rel="noopener noreferrer"&gt;https://pypi.org/project/pyscn/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;X: &lt;a href="https://x.com/pyscn_official" rel="noopener noreferrer"&gt;https://x.com/pyscn_official&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tooling</category>
      <category>opensource</category>
      <category>python</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Pyscn: The Code Quality Analyzer for Vibe Coders</title>
      <dc:creator>DaisukeYoda</dc:creator>
      <pubDate>Sun, 12 Oct 2025 00:03:23 +0000</pubDate>
      <link>https://dev.to/daisukeyoda/pyscn-the-code-quality-analyzer-for-vibe-coders-18hk</link>
      <guid>https://dev.to/daisukeyoda/pyscn-the-code-quality-analyzer-for-vibe-coders-18hk</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Are you riding the wave of &lt;strong&gt;Vibe Coding&lt;/strong&gt; with AI assistants, churning out code faster than ever? The speed is thrilling — but how do you keep your codebase clean, maintainable, and scalable?&lt;/p&gt;

&lt;p&gt;I've created &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;pyscn&lt;/a&gt;, a high-speed code quality analyzer for Python, built with Go. It's designed specifically for modern developers who leverage AI tools like Claude Code, Codex, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;AI coding assistants are powerful allies. However, as projects grow in scale and complexity, relying solely on AI-generated code can lead to a tangled mess. Many developers have experienced this: the codebase becomes difficult to navigate, and what started as rapid development slows to a crawl.&lt;/p&gt;

&lt;p&gt;I noticed a few common pitfalls in this new era of &lt;strong&gt;vibe-driven development&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Duplication:&lt;/strong&gt; Subtle variations of the same logic creeping into different parts of the codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complex Dependencies:&lt;/strong&gt; Modules becoming tightly coupled without a clear architectural vision.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deeply Nested Functions:&lt;/strong&gt; Logic that is hard to read, test, and debug.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;pyscn&lt;/code&gt; was born out of the need to address these issues. It analyzes your code for these specific problems, helping you catch "technical debt" introduced by AI-assisted coding before it becomes a major headache.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The easiest way to try &lt;code&gt;pyscn&lt;/code&gt; is to run it without installation, directly in your project directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;# If you use pipx&lt;/span&gt;
pipx run pyscn analyze &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Or if you use uv&lt;/span&gt;
uvx pyscn analyze &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;(Note: if you've ever tried &lt;code&gt;pyscn&lt;/code&gt; before, use &lt;code&gt;uvx pyscn@latest analyze .&lt;/code&gt; to use latest version.)&lt;/p&gt;
&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;pyscn&lt;/code&gt; has two main commands to fit your workflow:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;pyscn analyze&lt;/code&gt;: In-Depth Analysis &amp;amp; Reporting
&lt;/h3&gt;

&lt;p&gt;This command performs a comprehensive analysis and generates a beautiful, interactive HTML report. It gives you a bird's-eye view of your project's health, highlighting dead code, overly complex functions, and code clones.&lt;/p&gt;

&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%2Frzzj6ayldwtfht1eeits.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%2Frzzj6ayldwtfht1eeits.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;pyscn check&lt;/code&gt;: Quick Code Health Checks in Your Terminal
&lt;/h3&gt;

&lt;p&gt;This command is designed for automation. It acts like a linter, scanning your code for issues and reporting them directly in the terminal. If it finds code that exceeds your configured thresholds (e.g., cyclomatic complexity greater than 15), it will exit with an error code, failing the check. This makes it perfect for integrating into your pre-commit hooks or CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;Here’s a quick example with &lt;code&gt;uvx pyscn@latest check testdata&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testdata/python/simple/dead_code_simple.py:12:1: unreachable_after_return&lt;span class="o"&gt;(&lt;/span&gt;critical&lt;span class="o"&gt;)&lt;/span&gt;
testdata/python/edge_cases/nested_structures.py:0:1: main is too complex &lt;span class="o"&gt;(&lt;/span&gt;23 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 10&lt;span class="o"&gt;)&lt;/span&gt;
testdata/python/edge_cases/python310_features.py:116:1: clone of testdata/python/simple/control_flow.py:133:1 &lt;span class="o"&gt;(&lt;/span&gt;similarity: 99.3%&lt;span class="o"&gt;)&lt;/span&gt;
testdata/python/edge_cases/python310_features.py:49:1: clone of testdata/python/edge_cases/python310_features.py:143:1 &lt;span class="o"&gt;(&lt;/span&gt;similarity: 99.2%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As you can see, it pinpoints the exact location of issues like unreachable code and potential code clones.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Reaction from Hacker News
&lt;/h2&gt;

&lt;p&gt;I officially released version 1.0.0 last week and posted it on Hacker News. The response was far greater than I had imagined.&lt;/p&gt;

&lt;p&gt;The post sparked a lively discussion around "Vibe Coding" and the challenges of maintaining code quality in the age of AI. It was incredibly valuable to hear from core developers. Comments like, &lt;em&gt;"This could be really useful for reviewing AI-generated code"&lt;/em&gt; and &lt;em&gt;"This is important for maintaining architectural sanity,"&lt;/em&gt; affirmed that &lt;code&gt;pyscn&lt;/code&gt; is solving a real-world problem.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This is just the beginning for &lt;code&gt;pyscn&lt;/code&gt;. I'm actively exploring new features, many of which are still in the conceptual stage beyond what's listed in the GitHub Issues.&lt;/p&gt;

&lt;p&gt;Two of the most requested features are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expanding support to JavaScript/TypeScript.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration with AI agentic workflows&lt;/strong&gt; (e.g., allowing AI agents to use &lt;code&gt;pyscn&lt;/code&gt;'s analysis to autonomously review and refactor code).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm excited about the future of &lt;code&gt;pyscn&lt;/code&gt; and would love to hear your ideas! Feel free to open an Issue or start a Discussion on GitHub.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ludo-technologies" rel="noopener noreferrer"&gt;
        ludo-technologies
      &lt;/a&gt; / &lt;a href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;
        pyscn
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An Intelligent Python Code Quality Analyzer
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;

  
  
  &lt;img alt="pyscn" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fludo-technologies%2Fpyscn%2Fassets%2Flogo-light.svg" width="320"&gt;

&lt;p&gt;&lt;strong&gt;A code quality analyzer for Python vibe coders.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Building with Cursor, Claude, or ChatGPT? pyscn performs structural analysis to keep your codebase maintainable.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to/daisukeyoda/pyscn-the-code-quality-analyzer-for-vibe-coders-18hk" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/f1367e8ac54cb6ec77443f5c0097905c1b7c240bfd7389452343467303377f79/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6465762e746f2d41727469636c652d3041304130413f7374796c653d666c61742d737175617265266c6f676f3d6465762e746f" alt="Article"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/pyscn/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ca3ac9d9b49e245b10bfc2bb94e88a10ddca4e26007f3f05e42809cc82fb2d88/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f707973636e3f7374796c653d666c61742d737175617265266c6f676f3d70797069" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/pyscn/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3ccca71bd573703e7031133e2aa1cc7621b12912d89bdb6ff074caa5bf13b33b/68747470733a2f2f696d672e736869656c64732e696f2f707970692f646d2f707973636e3f7374796c653d666c61742d737175617265266c6f676f3d70797069266c6162656c3d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://go.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0426285d6a4b2298216ae0a6301c5b9613479aff9c9585955876ade19712059a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f676f2d6d6f642f676f2d76657273696f6e2f6c75646f2d746563686e6f6c6f676965732f707973636e3f7374796c653d666c61742d737175617265266c6f676f3d676f" alt="Go"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ludo-technologies/pyscn/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9234a8aea68ae9e90e440417a75dd487e0cc248cdb5e92804b3a01acc295a71e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6c75646f2d746563686e6f6c6f676965732f707973636e3f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Working with JavaScript/TypeScript? Check out &lt;a href="https://github.com/ludo-technologies/jscan" rel="noopener noreferrer"&gt;jscan&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Run analysis without installation&lt;/span&gt;
uvx pyscn@latest analyze &lt;span class="pl-c1"&gt;.&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or&lt;/span&gt;
pipx run pyscn analyze &lt;span class="pl-c1"&gt;.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;


  
    
    

    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;🔍 &lt;strong&gt;CFG-based dead code detection&lt;/strong&gt; – Find unreachable code after exhaustive if-elif-else chains&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;Multi-algorithm clone detection (Type 1-4)&lt;/strong&gt; – Identify refactoring opportunities with LSH acceleration&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Coupling metrics (CBO)&lt;/strong&gt; – Track architecture quality and module dependencies&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Cyclomatic complexity analysis&lt;/strong&gt; – Spot functions that need breaking down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;100,000+ lines/sec&lt;/strong&gt; • Built with Go + tree-sitter&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;MCP Integration&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Run pyscn analyses straight from AI coding assistants via the Model Context Protocol (MCP). The bundled &lt;code&gt;pyscn-mcp&lt;/code&gt; server exposes the same tools used in the CLI to Claude Code, Cursor, ChatGPT, and other MCP clients.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;MCP Use Cases&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;You can interact with…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ludo-technologies/pyscn" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>python</category>
      <category>cli</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
