Blog
Essays, playbooks, and product updates.
When Your Labels Lie: File-Level Bug Attribution Inflates Defect Rates
Most defect prediction pipelines share a quiet assumption: if a file was touched in a bug-fix commit, every function in that file was 'buggy' — and that assumption silently inflate…
How to Know If Fine-Tuning Will Help Before You Run It
Before you spend compute on per-repo fine-tuning, one scalar from the codebase's bug-fix history can tell you whether it's worth running. Here's how it works and what it can't pred…
JavaScript Code Health: Patterns Across 19 Open-Source Repositories
I analyzed 19 open-source JavaScript repositories and found exit-heavy functions in 89% of them. Here's what the data reveals about structural debt in the JavaScript ecosystem.
Python Code Health: Patterns Across 12 Open-Source Repositories
I analyzed 12 open-source Python repositories and found complex branching in 100% of them. Here's what the data reveals about Python code health patterns.
Rust Code Health: Patterns Across 11 Open-Source Repositories
I analyzed 11 popular Rust repositories to find the most common code health antipatterns. Every single one had exit-heavy functions and long functions — Rust's ownership model does…
TypeScript Code Health: Patterns Across 44 Open-Source Repositories
I analyzed 44 TypeScript repositories and found structural antipatterns in nearly all of them. Here's what the data shows about where complexity accumulates.
Go Code Health: Patterns Across 12 Open-Source Repositories
I analyzed 12 Go repositories and found the same structural antipatterns in every single one. Here's what the data shows.
Hotspots v1.18.0: Compact Storage
Snapshot history is valuable. Unbounded snapshot growth is not. v1.18.0 ships two compaction levels that shrink your .hotspots directory without losing the history that matters.
Hotspots v1.17.0: Model Risk Map and Monorepo Subsystems
Hotspots already tells you which functions are risky. v1.17.0 tells you which models those functions cluster around — and makes risk scores meaningful inside monorepo package bound…
Can a Fine-Tuned LLM Learn Which Code Is Risky?
I spent a few weeks running a controlled experiment: can a small language model, fine-tuned on a specific codebase's history, learn to rank code by defect risk better than a hand-t…
Hotspots now handles monorepos — what changed from v1.11 to v1.15.1
The diff command shipped in v1.11. Since then: four months of OOM fixes, a new SQLite pipeline, hybrid touch mode, and --auto-analyze. Hotspots now handles 28k-function monorepos a…
TypeScript produces less exit-heavy code than Go or Python — and more branching
exit_heavy averages 5.3 in non-TypeScript repos and 4.5 in TypeScript. complex_branching has the highest max-out rate of any pattern in TS. The flip is structural, not stylistic — …
Hub functions are a frontend framework problem — here's the data
hub_function barely appears in Go, Rust, or Python repos. In TypeScript UI framework code it's concentrated in coordinator functions with fan-out values of 37–112. Here's why.
Five structural patterns appear in nearly every TypeScript OSS repo I've analysed
Five structural patterns — god_function, long_function, exit_heavy, complex_branching, deeply_nested — appear in 86–100% of the 28 TypeScript OSS repos I've analysed. Here's what t…
Running Hotspots on expo/expo Without Running Out of Memory
expo/expo crashed Hotspots with an OOM. Here's the full account: what broke, the systematic fixes across memory and CPU, and the new escape-hatch flags that make very large repos p…
hotspots diff: Compare Complexity Between Any Two Branches, Tags, or Commits
Delta mode compares a commit to its parent. That's fine for local development — but CI needs to compare a PR branch to main, and tag comparisons need to reach back further. hotspot…
What Happens When You Run Hotspots on 102,000 Functions
I stress-tested Hotspots against VS Code (102k functions) and found an O(N³) bug, a sampling tail exclusion bug, and a philosophical question about approximation accuracy — all in …
AI Agents Can Pass Tests. They Still Can't Maintain Systems.
AI coding tools have made writing software dramatically easier. A new benchmark shows maintaining it is still the hard part — and the failure modes are predictable.
AI Made Code Cheap. The Bottleneck Is Now Understanding Systems.
AI removed code production as the engineering bottleneck. The new constraint is comprehension - and most developer tooling wasn't built for that problem.
The 20% Rule for Codebases: A Practical Refactoring Playbook
Use this practical worksheet to intersect change and complexity, pick three high‑leverage targets, and add simple guardrails to prevent backslide.
Stop Missing Regressions in PRs: Complexity Policy Checks in CI
Code review misses slow creep. Use Hotspots policies in CI to stop risky complexity changes before they merge — start warn‑only, then flip to blocking.
Introducing Hotspots: Find Risky Functions and Stop Regressions
Meet Hotspots — a lightweight analyzer with explainable risk, shareable reports, and CI policies so you fix what matters and keep it from slipping back.
Repository Analyses
Nightly hotspot reports for popular open-source repos. Browse all →