◉CLAUDE LABJP
●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…
Articles/Claude Code
⟐ Claude Code/2026-05-24Advanced

Retiring Dormant SDKs with Claude Code — A 12-Year Indie Developer's Pipeline for Safely Auditing Inactive Dependencies

Twelve years of indie iOS/Android development leaves a quiet sediment of SDKs that nobody calls anymore — but the dependencies remain. Here is the Claude Code pipeline I built to audit and safely retire them across four wallpaper apps, with the actual code and four weeks of operational metrics.

Claude Code264SDK cleanupTechnical debtCocoaPodsSPMGradleIndie developmentiOS26Android8

✦ Premium Article

"This app still has that A/B testing SDK from 2018 in its Podfile" — when Claude Code surfaced that in a session, my hands stopped. The app has been running since 2014. The version of me from back then evaluated and adopted that SDK on purpose. But somewhere along the way I stopped opening its dashboard, and the only thing left was the small, recurring cost of keeping up with its major version bumps on every release.

When you stay with indie development for twelve years, this kind of "dormant SDK" sediment is unavoidable. Ad networks, analytics, push notifications, A/B testing frameworks, crash reporters, remote config — each one had a reason at the time of adoption. The reason is gone now, but the SDK lives on inside Podfile, Package.swift, and build.gradle.

I run four wallpaper apps, and their cumulative downloads have passed 50 million. Each app carries a few dozen SDKs, which makes more than a hundred dependencies in total to maintain. Auditing that by hand is no longer realistic. So I asked Claude Code to run a decommissioning pipeline against all four apps for about four weeks, and the result was a 18.3% binary size reduction overall. Cold builds also got 31 seconds faster on average, and I no longer had to refresh the Privacy Manifest for any of the four apps.

This article documents the "dormant audit → safe removal → regression detection" workflow I converged on during those four weeks, with the actual code and the operational numbers. If you are also fighting a twelve-year sediment of dependencies as an indie developer, I hope it is useful.

Why "unused" SDKs keep costing you every month

The cost of dormant SDKs sits in places that are easy to miss. Across four weeks of observation, I categorized it into four buckets.

  1. Binary size: 200KB–2.5MB per SDK. Four apps × five dormant SDKs on average added up to 12–60MB of wasted bytes
  2. Cold build time: Each SDK adds 3–8s to a clean Xcode build through dependency resolution and initialization. Every wait pulls me out of the flow Claude Code is keeping me in
  3. Privacy Manifest / Data Safety: Since May 2024, Apple recursively aggregates the Privacy Manifests of your dependencies. Data collection declarations from SDKs you do not even call anymore stay in your manifest and drag your review through them
  4. Security alerts: GitHub Dependabot and Snyk keep firing CVE alerts for SDKs you never call. The signal-to-noise ratio of "which PR actually matters" gets quietly destroyed

The third one is especially uncomfortable for me. Since 2019, when I watched a ring of light over Kichijoji station and started making visual work, I have been treating the privacy hygiene of my wallpaper apps as part of the integrity I expect from my own art. Carrying data-collection declarations from SDKs I no longer use feels like a small lie against that integrity.

A three-axis score for "removable" vs "not removable" SDKs

The difficulty of removal does not show up in the manifest. pod 'XyzSDK' in Podfile could mean the SDK is never called at all, or that one file initializes it and never touches the API. Conversely, a single file may import an SDK through a Bridging Header in a way that no naive grep will catch.

Before letting Claude judge anything, I defined three axes that can be scored mechanically.

  • Reach Score: how reachable the module is from the current entrypoints, traced through the AST. 0–100
  • Symbol Density: density of the SDK's public symbols in the source tree. A rough grep gets you most of the way
  • Bridge Risk: presence of paths that static analysis cannot see — Objective-C Bridging Header, Kotlin/Java interop, method swizzling, KVC/KVO, reflection, JNI

With these three axes, an SDK with Reach=0, Density=0.0001, Bridge=Low is almost certainly removable, while Reach=0, Density=0, Bridge=High is dangerous and needs dynamic verification before removal. Without this pre-bucketing, asking Claude to "evaluate every SDK" leads to Claude flagging everything as risky, and you end up removing nothing.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦A complete, copy-and-run set of scripts for scanning dependencies across iOS (CocoaPods/SPM) and Android (Gradle), scoring removal risk, and auto-generating decommissioning PRs
✦A hybrid AST + grep + symbol-resolution design for letting Claude judge what can and cannot be removed, with a measured 80% reduction in false positives compared to naive grep
✦Four weeks of operational results across four wallpaper apps: 18.3% binary size reduction, 31s faster cold builds on average, and complete removal of three discontinued ad SDKs
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⟐ Claude Code2026-10-12
After Moving to SPM, My App Died the Moment It Launched — Reading One dyld Line with Claude Code
Right after moving from CocoaPods to Swift Package Manager, the build passed but the app died on launch. Here is how I traced one dyld line to its cause, the fix, and how to verify it.
⟐ Claude Code2026-09-04
The One File I Keep Out of Claude Code's Reach: project.pbxproj
With Xcode project files, the breakage that still opens costs far more than the breakage that refuses to open. Here is what I measured before moving every edit behind a script, and where the line sits today.
⟐ Claude Code2026-08-12
When Paying Users Still See Ads: Collapsing the Ad-Free Check Into One Place
A user who paid to remove ads still sees them. The cause is rarely a missing flag — it is a check that lives in too many places. Here is how I inventoried every ad call with Claude Code and folded the decision into a single gate.