<?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: Prince Jain</title>
    <description>The latest articles on DEV Community by Prince Jain (@princejain756).</description>
    <link>https://dev.to/princejain756</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%2F4179047%2Fb4603a50-4b5e-45dd-a2b8-705262e24dd1.jpg</url>
      <title>DEV Community: Prince Jain</title>
      <link>https://dev.to/princejain756</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/princejain756"/>
    <language>en</language>
    <item>
      <title>Rejected twice by App Review: two sandbox bugs that nearly killed my first macOS app</title>
      <dc:creator>Prince Jain</dc:creator>
      <pubDate>Tue, 13 Oct 2026 09:34:37 +0000</pubDate>
      <link>https://dev.to/princejain756/rejected-twice-by-app-review-two-sandbox-bugs-that-nearly-killed-my-first-macos-app-1o4m</link>
      <guid>https://dev.to/princejain756/rejected-twice-by-app-review-two-sandbox-bugs-that-nearly-killed-my-first-macos-app-1o4m</guid>
      <description>&lt;p&gt;i shipped my first macOS app last week. it got rejected twice by App Review, and both times the bug was the kind of thing you only learn by being bitten.&lt;/p&gt;

&lt;p&gt;bug 1: entitlement keys do not take false&lt;/p&gt;

&lt;p&gt;my entitlements.plist had camera, mic, and location keys set to false. my reasoning was "the app does not use these, so declare that." that is not how it works. entitlement keys only grant access; to deny access you omit the key. worse, those restricted keys were not in my provisioning profile, so amfid rejected the signature outright with "Restricted entitlements not validated - No matching profile found" and the kernel killed the binary at exec. Killed: 9, no window, nothing.&lt;/p&gt;

&lt;p&gt;Guideline 2.4.5(i): invalid sandbox entitlements. fair enough.&lt;/p&gt;

&lt;p&gt;bug 2: the sandboxed WKWebView blank screen&lt;/p&gt;

&lt;p&gt;the app is a thin WKWebView wrapper around a local html/css/js ui, all bundled, zero network calls. on review, the window opened black and empty.&lt;/p&gt;

&lt;p&gt;reproduced it locally with a debug WKNavigationDelegate: webContentProcessDidTerminate, every time. the log said com.apple.WebKit.WebContent "Application does not have permission to communicate with network resources". the WebContent process needs com.apple.security.network.client to even exist, fully offline file:// content included. apple documents this nowhere obvious. add the key, the process lives, the ui renders. didFinish fires, whole deck visible.&lt;/p&gt;

&lt;p&gt;Guideline 2.1(a): app was incomplete on launch. also fair.&lt;/p&gt;

&lt;p&gt;what shipped&lt;/p&gt;

&lt;p&gt;Zero-Power Player is an offline audio player for study sessions: local files (mp3/aac/m4a/flac/wav) cached in IndexedDB, a binaural beat generator with 10/16/40 Hz presets, brown noise and rain mixer, a pomodoro timer, and a projector wall mode that puts a giant timer and track title up for the room. it idles around 0% cpu because decoding goes through native hardware paths.&lt;/p&gt;

&lt;p&gt;free, no account, no ads, no analytics. macOS 15+.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/zero-power-player/id6816212859?mt=12" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/zero-power-player/id6816212859?mt=12&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;source is public if you want to see how dumb the actual diff was: &lt;a href="https://github.com/princejain756/Zero-Power-Player" rel="noopener noreferrer"&gt;https://github.com/princejain756/Zero-Power-Player&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the whole fix was deleting 3 xml keys and adding 1. two rejections, one week, for that.&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>I audited my AI agent stack: 92,413 tokens burned before the first message</title>
      <dc:creator>Prince Jain</dc:creator>
      <pubDate>Mon, 12 Oct 2026 12:10:36 +0000</pubDate>
      <link>https://dev.to/princejain756/i-audited-my-ai-agent-stack-92413-tokens-burned-before-the-first-message-52hc</link>
      <guid>https://dev.to/princejain756/i-audited-my-ai-agent-stack-92413-tokens-burned-before-the-first-message-52hc</guid>
      <description>&lt;p&gt;A while back there was a thread on r/mcp: "Running 15+ MCP servers can burn 60,000 tokens before your agent reads a message." Everyone in the comments was fixing it piecemeal: lazy-loading hacks, a homemade get-tool-help tool, grepping &lt;code&gt;/context&lt;/code&gt; output by hand.&lt;/p&gt;

&lt;p&gt;Nobody had built the diagnostic. So I did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it measures
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ctxvitals&lt;/code&gt; launches each stdio MCP server in your config, sends a real &lt;code&gt;initialize&lt;/code&gt; + &lt;code&gt;tools/list&lt;/code&gt;, and counts the actual schema tokens each one injects into context. Then it does the same for skills, rules files, commands, and hooks across Claude Code, Cursor, Windsurf, Copilot, Codex, and Devin configs.&lt;/p&gt;

&lt;h2&gt;
  
  
  My results were bad
&lt;/h2&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;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;skills installed&lt;/td&gt;
&lt;td&gt;901&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skill description tokens (always loaded)&lt;/td&gt;
&lt;td&gt;39,402&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP servers&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tokens burned per turn&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;92,413&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grade&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;F&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The embarrassing part wasn't the number. It was why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the same MCP server was configured under 3 different names, paying schema cost 3 times&lt;/li&gt;
&lt;li&gt;a plaintext API key sitting in an env block&lt;/li&gt;
&lt;li&gt;one server pointing at a binary that doesn't exist anymore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And after shipping per-tool rankings today (a Reddit suggestion), I found out &lt;code&gt;claude-code&lt;/code&gt;'s &lt;code&gt;Read&lt;/code&gt; tool alone costs 7,487 tokens of schema. One tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  It also checks security
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;hardcoded secrets in configs and skill files&lt;/li&gt;
&lt;li&gt;exfil patterns (credential stores + network calls in the same file)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl | sh&lt;/code&gt; installers&lt;/li&gt;
&lt;li&gt;prompt-injection phrases&lt;/li&gt;
&lt;li&gt;unpinned &lt;code&gt;npx&lt;/code&gt;/&lt;code&gt;uvx&lt;/code&gt; packages&lt;/li&gt;
&lt;li&gt;duplicate registrations resolving to different binaries, which means which one answers your tool calls then depends on load order. supply-chain roulette.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ctxvitals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero dependencies, Node 18+. &lt;code&gt;--html report.html&lt;/code&gt; for a shareable report, &lt;code&gt;--json&lt;/code&gt; for piping, &lt;code&gt;--no-probe&lt;/code&gt; if you don't want it launching servers. There's also a Claude skill so your agent can audit itself.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/princejain756/ctxvitals" rel="noopener noreferrer"&gt;https://github.com/princejain756/ctxvitals&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Honest question: what does your stack burn? I've seen 92k (mine, embarrassing). Someone tell me the ceiling.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>llm</category>
      <category>mcp</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I counted the strangers inside famous npm dependency trees</title>
      <dc:creator>Prince Jain</dc:creator>
      <pubDate>Mon, 12 Oct 2026 10:28:01 +0000</pubDate>
      <link>https://dev.to/princejain756/i-counted-the-strangers-inside-famous-npm-dependency-trees-4hck</link>
      <guid>https://dev.to/princejain756/i-counted-the-strangers-inside-famous-npm-dependency-trees-4hck</guid>
      <description>&lt;p&gt;Your node_modules isn't yours. It's a crowd of strangers you invited in.&lt;/p&gt;

&lt;p&gt;Every &lt;code&gt;npm install&lt;/code&gt; is an act of trust. You vetted the package you typed; you didn't vet the hundreds of transitive packages that came with it, or the accounts that can publish the next version of each.&lt;/p&gt;

&lt;p&gt;I built a zero-dependency CLI that reads package-lock.json and counts every npm account with publish rights in your tree. Then I ran it on famous repos.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;repo&lt;/th&gt;
&lt;th&gt;packages&lt;/th&gt;
&lt;th&gt;strangers&lt;/th&gt;
&lt;th&gt;top stranger's share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kong/insomnia&lt;/td&gt;
&lt;td&gt;1,571&lt;/td&gt;
&lt;td&gt;1,786&lt;/td&gt;
&lt;td&gt;8.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;axios/axios&lt;/td&gt;
&lt;td&gt;1,416&lt;/td&gt;
&lt;td&gt;809&lt;/td&gt;
&lt;td&gt;12.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;microsoft/vscode&lt;/td&gt;
&lt;td&gt;1,179&lt;/td&gt;
&lt;td&gt;710&lt;/td&gt;
&lt;td&gt;10.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;github/docs&lt;/td&gt;
&lt;td&gt;1,014&lt;/td&gt;
&lt;td&gt;710&lt;/td&gt;
&lt;td&gt;11.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm/cli&lt;/td&gt;
&lt;td&gt;851&lt;/td&gt;
&lt;td&gt;450&lt;/td&gt;
&lt;td&gt;12.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;microsoft/playwright&lt;/td&gt;
&lt;td&gt;632&lt;/td&gt;
&lt;td&gt;390&lt;/td&gt;
&lt;td&gt;18.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ionic&lt;/td&gt;
&lt;td&gt;491&lt;/td&gt;
&lt;td&gt;340&lt;/td&gt;
&lt;td&gt;21.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Insomnia's tree has more strangers than packages: 1,786 people can ship code into an app that stores your API keys.&lt;/p&gt;

&lt;p&gt;The account at the top of three of those lists is the same person. &lt;code&gt;ljharb&lt;/code&gt; can publish into 12.9% of npm's own CLI, 10.3% of VS Code's install, and 18.7% of Playwright. One account, three supply chains. &lt;code&gt;sindresorhus&lt;/code&gt; alone is 21% of Ionic's tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Half the tree is one person
&lt;/h2&gt;

&lt;p&gt;Roughly 55% of packages in every tree I checked are maintained by exactly one account. Not a small team — one person with publish rights.&lt;/p&gt;

&lt;p&gt;npm audit checks for known vulnerabilities in versions you already have. It says nothing about who can publish the next version. That list is your actual attack surface — the xz backdoor was one overworked maintainer with commit access to a package half the internet ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;npx dep-census              #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;your project&lt;span class="s1"&gt;'s package-lock.json
&lt;/span&gt;&lt;span class="gp"&gt;npx dep-census owner/repo   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;any GitHub repo'&lt;/span&gt;s lockfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero dependencies, MIT, ~150 lines of logic. Full leaderboard in LEADERBOARD.md:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/princejain756/dep-census" rel="noopener noreferrer"&gt;https://github.com/princejain756/dep-census&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;npm only for now — yarn and pnpm lockfiles aren't parsed yet, and it says so in the readme.&lt;/p&gt;

</description>
      <category>npm</category>
      <category>security</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
