<?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: Rajpriyan S</title>
    <description>The latest articles on DEV Community by Rajpriyan S (@rajpriyan_s).</description>
    <link>https://dev.to/rajpriyan_s</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4100339%2F563f4439-d2af-4aeb-b00e-05436d9b1140.jpg</url>
      <title>DEV Community: Rajpriyan S</title>
      <link>https://dev.to/rajpriyan_s</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rajpriyan_s"/>
    <language>en</language>
    <item>
      <title>We Deleted `pip install` From a Dev Tool. Here's Everything That Broke.</title>
      <dc:creator>Rajpriyan S</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:54:35 +0000</pubDate>
      <link>https://dev.to/rajpriyan_s/we-deleted-pip-install-from-a-dev-tool-heres-everything-that-broke-3kg5</link>
      <guid>https://dev.to/rajpriyan_s/we-deleted-pip-install-from-a-dev-tool-heres-everything-that-broke-3kg5</guid>
      <description>&lt;p&gt;&lt;em&gt;Submitted for the **Side Quest · The Write-Up&lt;/em&gt;* — judged on insight, not audience size. This post covers, in order: what we reimplemented, what the standard library made genuinely painful, the package our own code made look unnecessary, and the specific edge case that cost us real debugging time.*&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CodeIntel Doctor Zero&lt;/strong&gt; — a single-file, offline codebase doctor that scores your repo's health, catches leaked secrets, finds duplicate code, and tells you exactly what to fix first. Built for &lt;strong&gt;Zero Dependency Hack 2026, Track A — Developer Tools &amp;amp; CLI&lt;/strong&gt;, with &lt;strong&gt;zero third-party runtime dependencies&lt;/strong&gt;, &lt;strong&gt;87 passing tests&lt;/strong&gt;, and a &lt;strong&gt;bit-for-bit reproducible build&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3vqcuyylkvrkjummz3bt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3vqcuyylkvrkjummz3bt.png" alt="CodeIntel Doctor Zero overview dashboard, dark theme, showing a 57/100 health score, file stats, and a prioritized findings list" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The local browser UI, rendered from the project's real &lt;code&gt;ui.html&lt;/code&gt; against the repo's own published fixture data — no mockup tool, this is the actual product.&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;Point it at any repository. In under a second, it hands you a &lt;strong&gt;0–100 health score you can actually audit line by line&lt;/strong&gt;, a prioritized "fix this first" list, an offline secret scanner, a real duplicate-code detector, local search, and a self-contained HTML report — all from &lt;strong&gt;one Python file, running on nothing but the standard library.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/rajpriyanid-creator/codeintel-doctor
&lt;span class="nb"&gt;cd &lt;/span&gt;codeintel-doctor-zero
python3 build.py          &lt;span class="c"&gt;# verifies runtime, runs 87 tests, builds a deterministic artifact&lt;/span&gt;
python3 codeintel.py analyze &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;pip install&lt;/code&gt;. No Docker. No API key. No internet connection — ever.&lt;/p&gt;




&lt;h2&gt;
  
  
  The constraint that started it
&lt;/h2&gt;

&lt;p&gt;Every dev-tool hackathon has the same shortcut available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install click rich pygments radon chardet jinja2 pytest ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seven or eight battle-tested libraries, and you're 80% of the way to a polished CLI before lunch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero Dependency Hack 2026&lt;/strong&gt; removed that shortcut on purpose. Track A's brief was blunt: build a real developer tool with &lt;strong&gt;zero third-party runtime dependencies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That reframes the actual question. It's no longer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can Python scan a repository?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Obviously — yes. The real question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How much genuine repository intelligence can you build when the entire package ecosystem is off the table — and can you prove it, not just claim it?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second half — &lt;em&gt;prove it&lt;/em&gt; — is what separates a gimmick from an engineering submission. So the project treats "zero dependencies" as a claim with receipts, not a badge in a README. Running &lt;code&gt;verify_zero_deps.py&lt;/code&gt; parses &lt;code&gt;codeintel.py&lt;/code&gt;'s actual &lt;code&gt;import&lt;/code&gt; statements with Python's own &lt;code&gt;ast&lt;/code&gt; module, checks every one against &lt;code&gt;sys.stdlib_module_names&lt;/code&gt;, scans for &lt;code&gt;subprocess&lt;/code&gt; calls, scans for network-capable imports, and scans for vendored packages. The real, generated output — captured in &lt;code&gt;deps-proof.txt&lt;/code&gt; — ends with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZERO-DEPENDENCY CHECK: PASS
THIRD-PARTY RUNTIME DEPS: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anyone can clone the repo and run that check themselves. That's the whole point.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we would normally have installed
&lt;/h2&gt;

&lt;p&gt;We didn't try to rebuild entire ecosystems — only the exact slice each capability needed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Typical dependency&lt;/th&gt;
&lt;th&gt;Stdlib foundation&lt;/th&gt;
&lt;th&gt;What we actually built&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLI parsing&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;click&lt;/code&gt; / &lt;code&gt;typer&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;argparse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;commands, flags, validation, CI-ready exit codes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal styling&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;rich&lt;/code&gt; / &lt;code&gt;colorama&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sys&lt;/code&gt;, &lt;code&gt;os&lt;/code&gt;, raw ANSI SGR&lt;/td&gt;
&lt;td&gt;TTY-aware severity coloring + &lt;code&gt;NO_COLOR&lt;/code&gt; fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tables&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tabulate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;strings + terminal I/O&lt;/td&gt;
&lt;td&gt;deterministic table renderer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repo traversal&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pathspec&lt;/code&gt; / &lt;code&gt;glob&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;os.walk&lt;/code&gt;, &lt;code&gt;fnmatch&lt;/code&gt;, &lt;code&gt;pathlib&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;ignore rules, symlink-loop safety, depth limits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoding detection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;chardet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UTF-8 probing + fallback&lt;/td&gt;
&lt;td&gt;text/binary classification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pygments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;extensions + shebangs&lt;/td&gt;
&lt;td&gt;heuristic language detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;radon&lt;/code&gt; / &lt;code&gt;lizard&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;re&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;estimated control-flow complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate detection&lt;/td&gt;
&lt;td&gt;MinHash-style libs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hashlib&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sliding-window fingerprint + verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret scanning&lt;/td&gt;
&lt;td&gt;dedicated scanners&lt;/td&gt;
&lt;td&gt;&lt;code&gt;re&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pattern rules, confidence, masking, baselines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML reports&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Jinja2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str.format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;self-contained, zero-asset HTML report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test runner&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pytest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unittest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;87-test regression suite&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;STDLIB.md&lt;/code&gt; documents &lt;strong&gt;17 real substitutions&lt;/strong&gt;, each with an honest note on where the hand-rolled version is &lt;em&gt;not&lt;/em&gt; a drop-in replacement. Our terminal renderer, for instance, never tries to become &lt;code&gt;rich&lt;/code&gt; — it only does severity colors, bold headers, TTY detection, and a plain fallback. That's all the product needed, so that's all we built.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the standard library made genuinely painful
&lt;/h2&gt;

&lt;p&gt;The table above makes it look like every substitution was a clean swap. It wasn't. This is the part most "we went dependency-free!" posts skip, and it's the actual insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Color support isn't just "print ANSI codes."&lt;/strong&gt; &lt;code&gt;colorama&lt;/code&gt;/&lt;code&gt;rich&lt;/code&gt; quietly handle Windows for you. The standard library does not. Legacy &lt;code&gt;cmd.exe&lt;/code&gt; needs &lt;code&gt;SetConsoleMode&lt;/code&gt; called on the console handle via &lt;code&gt;ctypes&lt;/code&gt; before ANSI escapes render at all — otherwise a Windows user sees literal &lt;code&gt;\x1b[36m&lt;/code&gt; garbage in their terminal instead of color. That's not in any stdlib color tutorial; you find it the first time someone runs your tool on a non-Windows-Terminal machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;fnmatch&lt;/code&gt; is not &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/strong&gt; &lt;code&gt;pathspec&lt;/code&gt; gives you real gitignore semantics for free: negation patterns (&lt;code&gt;!keep-this.py&lt;/code&gt;), directory-only patterns (&lt;code&gt;build/&lt;/code&gt;), and &lt;code&gt;**&lt;/code&gt; globstars. &lt;code&gt;fnmatch&lt;/code&gt; only does flat shell globs. Reimplementing "ignore like git ignores" correctly — including negation overriding an earlier broad match — took noticeably longer than the actual file-walking logic around it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;json.dumps&lt;/code&gt; is not deterministic by default.&lt;/strong&gt; Dict key order, float repr, and separator whitespace can all vary in ways that silently break a byte-for-byte reproducibility test. Getting the determinism suite to pass meant explicitly forcing &lt;code&gt;sort_keys=True&lt;/code&gt;, pinning separators, and controlling float formatting everywhere a score or percentage got serialized.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;unittest&lt;/code&gt; has no &lt;code&gt;pytest.mark.parametrize&lt;/code&gt;.&lt;/strong&gt; Every "run this same check against 10 fixture variations" test became a hand-rolled loop with &lt;code&gt;self.subTest(...)&lt;/code&gt;, which works but is far more ceremony than a decorator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no safe recursive directory walker built in.&lt;/strong&gt; &lt;code&gt;os.walk&lt;/code&gt; will happily follow a symlink into a loop unless you tell it not to — and even then, avoiding &lt;em&gt;directory&lt;/em&gt; symlink loops specifically (as opposed to just not following symlinks at all) needs manual &lt;code&gt;(st_dev, st_ino)&lt;/code&gt; tracking that a library like &lt;code&gt;pathspec&lt;/code&gt; or &lt;code&gt;scandir&lt;/code&gt;-based tools give you out of the box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are hard problems. They're just the fifty small taxes a package normally pays for you, silently, that become your problem the moment you remove it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The package our own code made look unnecessary
&lt;/h2&gt;

&lt;p&gt;If we had to name one: &lt;strong&gt;a dedicated secret-scanning tool&lt;/strong&gt; — the &lt;code&gt;detect-secrets&lt;/code&gt; / &lt;code&gt;trufflehog&lt;/code&gt; category of product.&lt;/p&gt;

&lt;p&gt;Those are real, well-built tools with entropy analysis, plugin architectures, and CI integrations. Ours is roughly 150 lines of &lt;code&gt;re&lt;/code&gt; patterns, a confidence heuristic, and a masking function — and for the specific job of &lt;em&gt;"tell a developer there might be a hardcoded credential before they commit it,"&lt;/em&gt; it does the same practical job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;severity + confidence + file + line + masked evidence + suggested fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're not claiming feature parity — no entropy scoring, no plugin system, no maintained rule database that updates as new credential formats appear. But the honest finding is that for the 80% case a small team actually needs — &lt;em&gt;"did someone just commit a password"&lt;/em&gt; — you don't need to install a scanning product. You need about a page and a half of regular expressions and the discipline to always mask what you find. That's a genuinely useful thing to know before your next &lt;code&gt;pip install&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Show, don't tell: the actual output
&lt;/h2&gt;

&lt;p&gt;This isn't a mockup. This is what &lt;code&gt;doctor --explain-score&lt;/code&gt; prints on a deliberately messy fixture repo — every point lost, every finding, generated from a real scan:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F628ikwaaa07lvianb4tz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F628ikwaaa07lvianb4tz.png" alt="Terminal screenshot showing codeintel.py doctor output with a full health-score breakdown by dimension and a HIGH severity finding for an oversized module" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the difference between &lt;strong&gt;analysis&lt;/strong&gt; ("here's some data") and &lt;strong&gt;diagnosis&lt;/strong&gt; ("here's what's wrong, why it matters, and what to do about it"). Every point lost is traceable to named, counted evidence — nothing is a magic number.&lt;/p&gt;

&lt;p&gt;Compare that to the plain &lt;code&gt;analyze&lt;/code&gt; summary on the same repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python3 codeintel.py analyze fixtures/messy-repo --plain
CODEINTEL DOCTOR ZERO
Repository: messy-repo
Health: 57/100

Files:               7
Lines:           1,014
Functions:          45
Classes:             0
Tests:               0

Languages
  Python          99.5%
  Markdown         0.5%

Top Risk Areas
  01 src/api/routes.py            68
  02 src/auth/login.py            10
  03 src/auth/register.py         10

Findings
  CRITICAL             0
  HIGH                 2
  MEDIUM              24
  LOW                  2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  And when you want it in a browser: the local UI
&lt;/h2&gt;

&lt;p&gt;The CLI is the primary interface, but &lt;code&gt;python3 codeintel.py ui .&lt;/code&gt; spins up the exact same analysis behind a single-page dashboard, served locally on &lt;code&gt;127.0.0.1&lt;/code&gt; with &lt;strong&gt;zero network requests&lt;/strong&gt; — nothing leaves your machine, and there's nothing to configure.&lt;/p&gt;

&lt;p&gt;The sidebar mirrors the CLI one-to-one: &lt;strong&gt;Overview, Doctor, Security, Duplicates, Structure, Search, Explain file.&lt;/strong&gt; Same data everywhere, just a different lens on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt; — the health ring, per-dimension bars, the "needs attention" queue, and language mix, all from one scan:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3vqcuyylkvrkjummz3bt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3vqcuyylkvrkjummz3bt.png" alt="CodeIntel overview dashboard with 57/100 health score circle, dimension bars for structure/maintainability/security/testing/documentation/duplication/hygiene, and a findings sidebar" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doctor&lt;/strong&gt; — the same prioritized findings as &lt;code&gt;doctor --explain-score&lt;/code&gt;, but as a sortable table with severity, location, and the suggested fix right next to it:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnurx65v6afx4lxt6tga6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnurx65v6afx4lxt6tga6.png" alt="CodeIntel Doctor tab showing a table of findings ranked HIGH to LOW with file locations and recommendations" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; — masked evidence, confidence-scored signals, nothing phrased as a certainty:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsveh3dmrtjdclabh4rzn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsveh3dmrtjdclabh4rzn.png" alt="CodeIntel Security tab showing counts of critical high medium and low findings and a table of masked credential evidence" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond these three, &lt;strong&gt;Duplicates&lt;/strong&gt; shows the sliding-window fingerprint clusters with exact file:line ranges on both sides of every match, &lt;strong&gt;Structure&lt;/strong&gt; surfaces likely entry points and a scanned-file table, &lt;strong&gt;Search&lt;/strong&gt; does live client-side text/symbol lookup against the current scan, and &lt;strong&gt;Explain file&lt;/strong&gt; drills into a single file's symbols, complexity, and findings.&lt;/p&gt;

&lt;p&gt;The important architectural decision here isn't the UI polish — it's that the browser layer &lt;strong&gt;does not run a second analysis engine.&lt;/strong&gt; It renders the exact same &lt;code&gt;AnalysisReport&lt;/code&gt; object that the CLI and the JSON/HTML report use. That means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLI · JSON · HTML · Browser  →  one analysis model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of four independent implementations that could quietly disagree with each other. One &lt;code&gt;Export JSON&lt;/code&gt; button, and the browser view and the CLI's &lt;code&gt;--json&lt;/code&gt; output are byte-for-byte the same data.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hardest problem: what even counts as "duplicate code"?
&lt;/h2&gt;

&lt;p&gt;A naive duplicate detector compares blocks of text directly — slow, and noisy. CodeIntel's pipeline instead does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source → normalize → tokenize → sliding windows → SHA-256 fingerprints
       → candidate matches → content verification → duplicate clusters
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the more interesting engineering decision isn't the algorithm — it's the honesty about its limits. The detector catches &lt;strong&gt;near-verbatim duplicates after normalization&lt;/strong&gt;. It does not claim to catch semantically identical code with renamed variables, and it says so directly in its own docs. So the finding is phrased as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Possible duplicated block"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;never:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"These two functions are semantically identical."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That restraint matters more than it sounds like it should. A tool that overclaims what it detects is a tool nobody trusts in CI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security scanning, without a security package
&lt;/h2&gt;

&lt;p&gt;The scanner looks for the usual credential-shaped trouble: private keys, API-key-like strings, hardcoded passwords, credential-bearing URLs, JWT-like values, disabled TLS verification, debug configs left on. It's pure &lt;code&gt;re&lt;/code&gt; pattern matching — no vulnerability database, no cloud lookup, and it never pretends otherwise. Every finding ships with severity, confidence, file, line, masked evidence, and a suggested fix — and the actual secret value is &lt;strong&gt;never&lt;/strong&gt; written anywhere, in any output mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_PASSWORD = "hunt********rd2024"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it makes zero network calls (mechanically verified, not assumed), your source code never leaves your machine while it's scanned. That's a genuine privacy property — but the docs are careful to separate that from a security guarantee: &lt;strong&gt;offline means private, not automatically safe.&lt;/strong&gt; Teams can accept known findings with &lt;code&gt;--baseline&lt;/code&gt; so CI only flags what's actually new.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reproducibility isn't a claim — it's a receipt
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;build.py&lt;/code&gt; produces a deterministic zipapp: fixed timestamps, fixed permissions, normalized metadata, sorted archive contents, then hashes the result. Here's an actual run, captured twice, from &lt;code&gt;deps-proof.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build 1 SHA-256: 276c1dc98360db0d61295258a3f6ee4073b7148c36155636c90cea91dc21401
Build 2 SHA-256: 276c1dc98360db0d61295258a3f6ee4073b7148c36155636c90cea91dc21401

MATCH: yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same input, same bytes, twice. That's a stronger sentence than "the build is reproducible" — it's a claim you can rerun yourself in thirty seconds.&lt;/p&gt;

&lt;p&gt;The determinism guarantee doesn't stop at the build. A dedicated test suite (&lt;code&gt;test_determinism.py&lt;/code&gt;) checks byte-identical JSON across repeated runs, stable file ordering, stable finding ordering, deterministic HTML output, and bounded health scores — because a repo scanner that gives you a different answer every time is worse than useless in a CI pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  CI-ready, not just demo-ready
&lt;/h2&gt;

&lt;p&gt;This is the part that turns a hackathon toy into something a real team could adopt tomorrow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 codeintel.py doctor &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--fail-on&lt;/span&gt; high
python3 codeintel.py security &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--baseline&lt;/span&gt; security-baseline.json &lt;span class="nt"&gt;--fail-on&lt;/span&gt; medium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exit code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;policy failure — a finding met/exceeded &lt;code&gt;--fail-on&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;usage / argument error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;filesystem / path error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;internal error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Drop it into a pipeline, gate merges on health regressions, and it never phones home. &lt;code&gt;--json&lt;/code&gt; for machines, &lt;code&gt;--plain&lt;/code&gt;/&lt;code&gt;--no-color&lt;/code&gt; for logs, &lt;code&gt;--baseline&lt;/code&gt; so a team only sees genuinely new security findings instead of re-litigating accepted ones every run.&lt;/p&gt;




&lt;h2&gt;
  
  
  The edge case that ate an afternoon
&lt;/h2&gt;

&lt;p&gt;The test cases that matter aren't clean files — they're the ones that break naive assumptions: Unicode filenames, binary content, NUL bytes, invalid encodings, huge files, deeply nested directories, &lt;strong&gt;symlink loops&lt;/strong&gt;, permission errors, empty repos, malformed baselines.&lt;/p&gt;

&lt;p&gt;The one that actually cost real time was a symlink loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo/
  src/
  link -&amp;gt; .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;link&lt;/code&gt; points back at the repo root. A naive recursive walker — which is exactly what an early version of the scanner was — turns that into unbounded recursion: &lt;code&gt;repo/link/link/link/link/...&lt;/code&gt; until Python hits its recursion limit or the process just hangs, depending on how the traversal was written. The failure mode is ugly precisely because it &lt;em&gt;looks&lt;/em&gt; like the tool is doing real work — CPU pinned, no error, no output — right up until it isn't.&lt;/p&gt;

&lt;p&gt;The fix wasn't "add a depth limit and call it done," because a depth limit just turns an infinite loop into a very slow, very wrong scan of the same directory a thousand times. The real fix was refusing to follow directory symlinks at all, which — as a side effect — also closes off a class of "read outside the intended tree" attacks for free. That one bug is the reason the traversal layer tracks visited directories instead of trusting the filesystem to behave.&lt;/p&gt;

&lt;p&gt;It's now a permanent regression test, and it's the best argument in the whole project for why "the standard library gave us the primitives, not the product": &lt;code&gt;os.walk&lt;/code&gt; will follow that symlink into the loop by default. Nothing warns you. You find out the hard way, once.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we deliberately did not build
&lt;/h2&gt;

&lt;p&gt;Scope discipline is part of the engineering, not a footnote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not a compiler or a full AST analyzer for every language&lt;/li&gt;
&lt;li&gt;Not a CVE database&lt;/li&gt;
&lt;li&gt;Not a code-coverage engine&lt;/li&gt;
&lt;li&gt;Not a semantic vector-search system&lt;/li&gt;
&lt;li&gt;Not a language server or cloud platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Symbol detection and complexity are regex/heuristic, and the output always says "estimated" or "probable" — never asserts certainty. We'd rather ship:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A fast, explainable first-pass signal."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This understands your entire codebase."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That honesty is documented up front in &lt;code&gt;STDLIB.md&lt;/code&gt; and the README's own limitations section — not buried, not discovered by a disappointed judge halfway through the demo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Single file, real structure
&lt;/h2&gt;

&lt;p&gt;The entire runtime lives in one file — &lt;code&gt;codeintel.py&lt;/code&gt;, the single-file bonus target — but it's organized into 24 clearly delimited sections (&lt;code&gt;# == SECTION&lt;/code&gt;) from constants and data models through the terminal/HTML renderers to &lt;code&gt;main()&lt;/code&gt;. One shared &lt;code&gt;AnalysisReport&lt;/code&gt;, produced once per scan, feeds every renderer — CLI, JSON, HTML, and the local browser UI shown above.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A single-file constraint changes the packaging model. It does not require abandoning engineering structure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The scoreboard
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project:            CodeIntel Doctor Zero
Track:               A — Developer Tools &amp;amp; CLI
Runtime:             Python 3.8+ (built/tested on 3.12)
Third-party deps:    0
Network requests:    0
Implementation:      single codeintel.py (~2,500 lines, 24 sections)
Automated tests:     87 passing
STDLIB substitutions: 17, documented with honest limitations
Reproducible build:  verified — identical SHA-256 across two builds
Commands:            analyze · doctor · search · security · tree ·
                     duplicates · explain · report · ui · demo-color
Bonus targets hit:   Package Killer (terminal engine) · STDLIB Log ·
                     single-file · reproducible build · CI exit codes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What zero dependencies actually taught us
&lt;/h2&gt;

&lt;p&gt;Removing the package registry doesn't prove third-party packages are bad. It just forces you to see the layers sitting underneath them.&lt;/p&gt;

&lt;p&gt;A table was a renderer we had to design. A duplicate was a definition we had to draw a line around. A health score was a model we had to make explainable. A security alert was a confidence threshold we had to choose and defend. Once the packages disappeared, every one of those decisions became ours to own — and to prove.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's the actual submission for Zero Dependency Hack 2026: not "look, no packages," but a working, tested, reproducible developer tool where every design decision that would normally hide inside a &lt;code&gt;pip install&lt;/code&gt; is visible, documented, and honest about its own limits.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/rajpriyanid-creator/codeintel-doctor" rel="noopener noreferrer"&gt;https://github.com/rajpriyanid-creator/codeintel-doctor&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://youtu.be/W4I1-tRH7sE" rel="noopener noreferrer"&gt;https://youtu.be/W4I1-tRH7sE&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Built for:&lt;/strong&gt; Zero Dependency Hack 2026 — Track A, Developer Tools &amp;amp; CLI · Side Quest, The Write-Up&lt;/p&gt;

&lt;p&gt;Tagging &lt;strong&gt;@HackathonRaptors&lt;/strong&gt; — thanks for running Side Quest and rewarding the write-up over the vote count.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; hackathonraptors· cli · opensource · showdev · hackathon · zerodependency · python  &lt;/p&gt;

</description>
      <category>python</category>
      <category>hackathon</category>
      <category>opensource</category>
      <category>hackathonraptors</category>
    </item>
  </channel>
</rss>
