<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>Ship Stories</title>
  <link>./index.html</link>
  <description>Tried / broke / fix ship logs from vibe coding and coding agents — Cursor, Claude Code, Bolt, Lovable. Curated from public sources.</description>
  <item>
    <title>Planted AGENTS.md in Downloads turned Codex into malware install</title>
    <link>./stories/agents-md-downloads-hijack.html</link>
    <guid>./stories/agents-md-downloads-hijack.html</guid>
    <description>A webpage silently dropped AGENTS.md into ~/Downloads; Codex obeyed it and installed malicious npm function-color in &gt;90% of tests. Claude Code CLAUDE.md variant leaked OAuth ~50%.</description>
  </item>
  <item>
    <title>Agents SDK burned the Claude Code 5-hour bar faster than the CLI</title>
    <link>./stories/agents-sdk-eats-five-hour-limit.html</link>
    <guid>./stories/agents-sdk-eats-five-hour-limit.html</guid>
    <description>Builders on T3 Code / Agents SDK saw the rolling 5-hour usage bar drain faster than interactive Claude Code; weekly limit unchanged. Theo flagged it as an Anthropic-side bug.</description>
  </item>
  <item>
    <title>Claude Code: one research prompt burned the usage window in ~10 min</title>
    <link>./stories/claude-code-usage-window-394-subagents.html</link>
    <guid>./stories/claude-code-usage-window-394-subagents.html</guid>
    <description>A max-effort Claude Code research turn spawned 394 subagent calls (341 concurrent) and ~84M tokens before lockout; parallel main sessions still drained the plan.</description>
  </item>
  <item>
    <title>Claude Code claude -p: project MCPs start without asking</title>
    <link>./stories/project-mcp-json-starts-without-ask.html</link>
    <guid>./stories/project-mcp-json-starts-without-ask.html</guid>
    <description>Anthropic MCP docs: in claude -p / Agent SDK / some cloud sessions, project .mcp.json servers load without the interactive approval prompt.</description>
  </item>
  <item>
    <title>LiteLLM 1.107.0 stole keys — GH CLI OAuth showed up in agent logs</title>
    <link>./stories/litellm-pypi-stealer-gh-cli-oauth.html</link>
    <guid>./stories/litellm-pypi-stealer-gh-cli-oauth.html</guid>
    <description>Poisoned PyPI/Docker release ran ~2h on Oct 21; official post ties the chain partly to Claude Code embedding GitHub CLI OAuth tokens into logged responses.</description>
  </item>
  <item>
    <title>Stripe invoice.payment_failed logged — access never revoked</title>
    <link>./stories/payment-failed-webhook-only-logs.html</link>
    <guid>./stories/payment-failed-webhook-only-logs.html</guid>
    <description>Cursor/Lovable Stripe webhook had the failure case, but only logged and returned 200 — users kept paid access forever.</description>
  </item>
  <item>
    <title>USING (true) RLS leaked the whole users table</title>
    <link>./stories/rls-using-true-leaked-users-table.html</link>
    <guid>./stories/rls-using-true-leaked-users-table.html</guid>
    <description>5/5 audited Cursor/Lovable apps had open read policies so anyone could SELECT *.</description>
  </item>
  <item>
    <title>Service-role key shipped in the browser bundle</title>
    <link>./stories/service-role-key-in-browser-bundle.html</link>
    <guid>./stories/service-role-key-in-browser-bundle.html</guid>
    <description>One vibe-coded app leaked the entire users table via a key that lived in page JS.</description>
  </item>
  <item>
    <title>Claude Code checked user_metadata.role — clients can set admin</title>
    <link>./stories/user-metadata-role-admin-escalation.html</link>
    <guid>./stories/user-metadata-role-admin-escalation.html</guid>
    <description>Role checks on client-writable metadata let any logged-in user promote themselves.</description>
  </item>
  <item>
    <title>Lovable deploy went green — auth still pointed at localhost</title>
    <link>./stories/lovable-deploy-auth-still-localhost.html</link>
    <guid>./stories/lovable-deploy-auth-still-localhost.html</guid>
    <description>Publish copied the UI; Site URL / redirects / Stripe webhook stayed on preview settings.</description>
  </item>
  <item>
    <title>Stripe Edge webhook returned 401 — verify_jwt blocked Stripe</title>
    <link>./stories/stripe-edge-webhook-401-verify-jwt.html</link>
    <guid>./stories/stripe-edge-webhook-401-verify-jwt.html</guid>
    <description>Supabase Edge Functions default JWT check rejected Stripe before the handler ran.</description>
  </item>
  <item>
    <title>Bolt export hit the Stripe wall — preview is not production</title>
    <link>./stories/bolt-export-stripe-preview-wall.html</link>
    <guid>./stories/bolt-export-stripe-preview-wall.html</guid>
    <description>App worked in Bolt preview; after export/deploy, real Stripe webhooks and live keys fell apart on Netlify/Vercel.</description>
  </item>
  <item>
    <title>Cursor agent ran git restore and wiped uncommitted work</title>
    <link>./stories/agent-git-restore-wiped-uncommitted.html</link>
    <guid>./stories/agent-git-restore-wiped-uncommitted.html</guid>
    <description>Sandbox Cursor agent restored a tracked file; new uncommitted edits were gone with no confirm.</description>
  </item>
  <item>
    <title>Max plan burned in ~3 heavy days — agents and plugins ate the window</title>
    <link>./stories/max-plan-burn-agents-and-plugins.html</link>
    <guid>./stories/max-plan-burn-agents-and-plugins.html</guid>
    <description>Tracked ~100 Claude Code sessions: subagents, screenshots, and unused MCPs dominated burn.</description>
  </item>
  <item>
    <title>Seven critical security leaks that keep showing up in AI apps</title>
    <link>./stories/vibe-security-checklist-seven-leaks.html</link>
    <guid>./stories/vibe-security-checklist-seven-leaks.html</guid>
    <description>Checklist from real vibe-coding audits: open RLS, service_role in client, wild CORS, unvalidated webhooks, and more demo defaults.</description>
  </item>
  <item>
    <title>Cursor free-iterate wrecked a finished Expo game</title>
    <link>./stories/cursor-free-iterate-wrecked-game.html</link>
    <guid>./stories/cursor-free-iterate-wrecked-game.html</guid>
    <description>Left Cursor free to iterate on Expo paths for itch.io; UI corrupted over ~2 hours. Recovered via last good git tag.</description>
  </item>
  <item>
    <title>Cursor auth worked in dev, dead in prod (hardcoded env)</title>
    <link>./stories/auth-dev-dead-prod-hardcoded-env.html</link>
    <guid>./stories/auth-dev-dead-prod-hardcoded-env.html</guid>
    <description>Cursor-built auth silently used a hardcoded environment variable; prod logins failed while local looked fine.</description>
  </item>
  <item>
    <title>Cursor context drift reverted OAuth back to API keys</title>
    <link>./stories/context-drift-oauth-to-api-keys.html</link>
    <guid>./stories/context-drift-oauth-to-api-keys.html</guid>
    <description>After Google OAuth, updating edge-function metadata made the agent reintroduce old API keys and break the flow.</description>
  </item>
  <item>
    <title>Stripe webhook returns 200 but never updates the database</title>
    <link>./stories/stripe-webhook-skeleton-no-db.html</link>
    <guid>./stories/stripe-webhook-skeleton-no-db.html</guid>
    <description>Cursor/Lovable Stripe handler returns 200 and logs the event, but never flips is_paid or access in the database.</description>
  </item>
  <item>
    <title>Bolt.new launch night: RLS and Stripe webhook gaps</title>
    <link>./stories/bolt-launch-rls-stripe-gaps.html</link>
    <guid>./stories/bolt-launch-rls-stripe-gaps.html</guid>
    <description>Second real user hit RLS/session timing; unsigned Stripe webhooks left the database stale on launch night.</description>
  </item>
  <item>
    <title>Same invoice-app spec: Lovable, Bolt, Cursor — three security profiles</title>
    <link>./stories/same-spec-three-security-profiles.html</link>
    <guid>./stories/same-spec-three-security-profiles.html</guid>
    <description>2026 study: Lovable missing RLS; Bolt secrets in the frontend; Cursor BOLA on invoice routes — same spec, different holes.</description>
  </item>
  <item>
    <title>Claude Code Stripe webhook without signature verification</title>
    <link>./stories/claude-code-stripe-no-signature.html</link>
    <guid>./stories/claude-code-stripe-no-signature.html</guid>
    <description>Generated Stripe webhook parsed JSON with no constructEvent — forgeable paid upgrades without signature check.</description>
  </item>
  <item>
    <title>Paying vibe SaaS with open RLS and dead email verify</title>
    <link>./stories/paying-saas-open-rls-dead-email.html</link>
    <guid>./stories/paying-saas-open-rls-dead-email.html</guid>
    <description>JWT still valid after cancel; is_paid writable from the browser; email_verified never flipped on a vibe-coded SaaS.</description>
  </item>
  <item>
    <title>Checkout refresh loop burned Claude Code API spend</title>
    <link>./stories/checkout-refresh-loop-api-spend.html</link>
    <guid>./stories/checkout-refresh-loop-api-spend.html</guid>
    <description>User hit refresh in a loop at checkout with no rate limit; every refresh fired expensive API routes on a Claude Code app.</description>
  </item>
  <item>
    <title>Two Markdown files that stop Cursor and Claude agent amnesia</title>
    <link>./stories/two-markdown-files-stop-amnesia.html</link>
    <guid>./stories/two-markdown-files-stop-amnesia.html</guid>
    <description>Append-only project log plus roadmap Markdown keeps Cursor, Claude Code, and Codex from forgetting decisions across sessions.</description>
  </item>
</channel>
</rss>
