◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Dev Tools
⬡ Dev Tools/2026-06-17Advanced

Auditing the Dependencies Rork Generates: A Supply-Chain Hygiene Routine

Even a four-screen Rork app pulls in 900+ transitive dependencies. Before a vulnerability lands and you cannot tell which app is affected, build an audit habit with npm ls, npm audit, overrides, and depcheck — framed for running several apps at once.

Rork611Dependencies4Security10npm4Long-term Operations4

✦ Premium Article

I once idly counted the node_modules in an exported Rork project. It was a small app, about four screens. Even so, the installed packages numbered over 900. I recognized maybe a dozen of them by name.

The actual request had been "let the user pick a photo and save it." Rork chose the libraries needed for that, each of which dragged in the libraries it depended on internally, and the total landed at 900. This is not Rork being careless; it is the everyday reality of modern JavaScript development. The problem arises when you carry that everyday reality across several apps as a solo developer.

I run several wallpaper and wellness apps in parallel. When each one carries hundreds of transitive dependencies, the day a vulnerability surfaces in some library, you can no longer tell at a glance which of your apps is affected. Precisely because the AI chooses the dependencies, you need a habit of taking inventory of what was chosen.

Below is the audit routine I actually run to keep the dependencies in Rork-generated apps from quietly expanding your supply-chain risk, alongside the exact commands.

First, make visible what you depend on

The first step of an inventory is to look at direct and transitive dependencies separately. What lines up in package.json is only the direct dependencies; the real risk hides in the transitive ones hanging beneath them. Even in a small app, it is not unusual for transitive dependencies to make up nearly 90% of the total.

I check the direct dependencies by limiting the depth to one level.

# List only direct dependencies (collapse transitive ones)
npm ls --depth=0
 
# Count the total including transitive dependencies
npm ls --all --parseable | wc -l
 
# Reverse-trace WHY a specific library is present
npm why <package-name>

That last one, npm why, is especially effective. When you find an unfamiliar package, you can trace back which direct dependency dragged it in. Discoveries like "an old compression library came in as a chain reaction for this image library" start here.

Sweep for vulnerabilities once a week, mechanically

After visibility comes checking for known vulnerabilities. I run this with no judgment involved, mechanically on a fixed day each week.

# List known vulnerabilities with severity
npm audit
 
# Auto-fix only within non-breaking changes
npm audit fix
 
# Fail CI on high severity and above (decide by exit code)
npm audit --audit-level=high

The thing to watch is not running npm audit fix on impulse. Add --force and it will apply compatibility-breaking major updates all at once, a pitfall that leaves your production build unable to compile. I target only high and above, confirming the impact of each update before taking it in.

When you have several apps, it helps to bundle this weekly sweep into one script.

#!/usr/bin/env bash
# audit-all.sh — check vulnerabilities across all apps at once
set -e
for app in ~/apps/*/; do
  echo "===== $(basename "$app") ====="
  ( cd "$app" && npm audit --audit-level=high || echo "vulnerabilities need attention" )
done

Running this once over the weekend tells you, in one list, which apps need attention. Just moving vulnerability response from "when I remember" to "a weekly inspection" sharply cuts what slips through.

✦

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 workflow that separates direct from transitive dependencies with npm ls and npm why, and reverse-traces how an unfamiliar package got in
✦A script that runs a weekly npm audit across all your apps, plus a severity filter that avoids breaking production builds with --force
✦Pinning transitive versions with overrides, removing unused dependencies with depcheck, and why native SDKs need their own separate ledger
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

Rork 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

⬡ Dev Tools2026-09-02
I counted how many versions expo install starts recommending after one patch bump
What expo install recommends is tied to the patch version of expo itself. I measured the ledger diff against the npm registry, how far npm install drifts, and the one check worth adding to a generated project.
⬡ Dev Tools2026-10-13
Before You Ship: Go Looking for Your Own Keys Inside the Exported Expo Bundle
A key can be missing from your source and still be sitting inside the finished app. I ran expo export on Expo SDK 57, searched the bundle with grep and a short Node script, and recorded which secrets show up and which don't.
⬡ Dev Tools2026-07-27
When to Raise Your Minimum iOS Version — Count Leftover Branches, Not User Percentages
Judging a minimum OS bump by usage share produces the same answer every year, so the decision never happens. Here is the annotation convention, the sweep script that counts how many iOS and Android branches each candidate floor would retire, and what to watch for 30 days after.