Two AI dev tool breaches this month: OpenCode (stored provider API keys) and Warp (agent traces and telemetry, contents not yet confirmed).
If you ever pasted a key into an agent chat, assume it's in a log somewhere. Rotate it.
#infosec#AI#vibecoding#cybersecurity#devtools
@jansulek Agree, and all three are testable from outside in minutes: search the live JS for sk_ and service_role, query each Supabase table with only the anon key, call your API routes logged out. I built a free scan for this: https://t.co/JP5Mg9TMfO
@harundotdev Honest answer for most small apps: never, because nobody has a list of where each key lives. Try it once this week: one key, end to end, timed. However long that takes is how long a stolen key stays live during your next incident.
@MRRydon@AndrewCurran_ And rotate means revoke at OpenAI or Anthropic first. Pasting a new value into Northflank leaves the old key alive for whoever already has it. Then check usage since 30 Oct and set a spend limit while you're in there.
@ihteshamali One addition from Cursor's notice: updating isn't enough if you had 2.1.312 or 2.1.313. Check ~/.ssh/authorized_keys for a key labelled svc-telemetry, remove the startup persistence it adds, then rotate keys that machine could read, from a different, clean machine.
@dbasch For the inventory, also note which secrets each tool can read. A .env on disk counts. And if anyone installed 2.1.312/2.1.313 from Cursor's marketplace, Cursor says uninstalling may not be enough: check authorized_keys, remove persistence, rotate from a clean machine.
@TrainCodeMan A bit of caution is healthy, but you don't have to avoid them. Check the package is the one you meant, that it's maintained and widely used, and pin the version. That covers most of it.
Question for people who fix AI-built apps for clients:
What's the first thing you open when someone hands you a Lovable/Bolt/Cursor codebase?
Mine: the database policies, then every place a secret key is read.
#indiehackers
@surfih Good point. Cron can fire twice, so the job should be safe to run again. Same pattern as webhooks: record what you've processed and skip repeats.
Vercel cron routes are just public URLs. Anyone who finds /api/cron/cleanup can call it.
Set a CRON_SECRET env var. Vercel sends it as "Authorization: Bearer <secret>" on every cron run, so your route can return 401 to everything else.
#webdev
@stackdrawn Fair point, and thanks. USING (true) on a TO authenticated policy means any signed-in user, not anon. Showing role, operation and condition together, then testing both sessions, is the clearer way to report it.
Question for people building on Supabase with Lovable, Bolt or Cursor:
When the AI writes a migration (new table, new policy), do you read the SQL before it runs, or only check that the feature works?
No wrong answer, I'm curious how people actually do it.
#vibecoding
robots.txt is public. Anything you list under Disallow is a signpost, not a lock.
If yours says Disallow: /admin or /internal-api, make sure those routes check auth on the server. Well-behaved crawlers skip them. Nobody else has to.
#webdev
Vite's build.sourcemap: 'hidden' doesn't make source maps private. It still writes the .map files and only drops the comment that points to them. Deploy dist/ and anyone can add .map to your script URL.
New guide on .env, .git and source maps: https://t.co/Hb6DmAg6y4
#webdev
Two Supabase Auth settings worth a minute before launch:
Site URL: still http://localhost:3000? Confirmation and password reset emails use it.
Redirect URLs: https://*.vercel.app/** matches anyone's Vercel app, not just yours. Scope previews to your team slug.
#Supabase
Question for people shipping with Lovable, Bolt or Cursor:
When the AI says "I've fixed the security issue", how do you check it actually did?
Re-run a scan, test it by hand, ask a second model, or take its word for it?
#buildinpublic
If your checkout code sends the price from the browser, anyone can change it.
Send a product or price ID. Look the amount up on the server. Confirm what was paid from the payment provider's webhook, not from the redirect page.
#indiehackers#Stripe
How to fix:
Swap it for an owner rule like auth.uid() = user_id.
Only keep using (true) on data you really mean to be public, like published blog posts.
Then sign in as a second user and try to load the first user's data.