Exposed API keys in Lovable apps
A secret key is meant to stay on your server. When it ends up in the code the browser downloads, anyone who opens your app can copy it and act as you. This page scans your live app for keys that should not be there.
Scan your Lovable app for exposed keys
What it means
A value shaped like a private key or password is in code your site serves, where anyone can read it. If it still works, anyone who copies it can act as you: run up bills, read your data, or send email in your name. xlogs did not test it.
Why AI tools cause it
AI coding tools often paste an API key straight into a file to make something work, instead of hiding it in a private environment variable. It runs fine, so nothing warns you.
How xlogs checks it
xlogs scans your live JavaScript against 18 key formats covering Stripe (live, test and webhook secrets), OpenAI, Anthropic, AWS, Google, GitHub, Slack, private key blocks, and Supabase server keys (service_role and sb_secret_).
How keys end up exposed
To make a feature work, an AI tool will sometimes paste a key directly into a file instead of hiding it in a server-only environment variable. The app runs fine, so nothing warns you. If that file is part of the frontend, the key ships to every visitor.
The scan reads your live JavaScript the way a visitor's browser does and matches it against known key formats for Stripe, OpenAI, AWS, Google, Supabase, and more. A public Supabase anon key is expected and is not flagged. A secret or service key is.
How to fix it
The goal: The exposed key has been replaced and revoked at the provider, because removing it from the code does not stop it working, and the new value is stored only in a server-side secret or environment variable, never in code or the client bundle.
- Contain and rotate the exposed key first, because removing it from the code does not stop it working: if you suspect it is being misused, revoke it at the provider now; otherwise create a replacement, put it in the app's server-side secret settings, confirm the app works with it, and then revoke the exposed key promptly
- Remove the literal value from the code and any client-side bundle (the affected spot), so the key is read only from a server-only environment variable
- Make sure the .env file is in .gitignore
- Clear the old value from deployed builds and caches, and from the repository's history where you can; once the key is revoked, a copy left there no longer works
In my app (the spot the scan shows): a credential-shaped value is publicly served. Please make this true: The exposed key has been replaced and revoked at the provider, because removing it from the code does not stop it working, and the new value is stored only in a server-side secret or environment variable, never in code or the client bundle. Steps: Contain and rotate the exposed key first, because removing it from the code does not stop it working: if you suspect it is being misused, revoke it at the provider now; otherwise create a replacement, put it in the app's server-side secret settings, confirm the app works with it, and then revoke the exposed key promptly; Remove the literal value from the code and any client-side bundle (the spot the scan shows), so the key is read only from a server-only environment variable; Make sure the .env file is in .gitignore; Clear the old value from deployed builds and caches, and from the repository's history where you can; once the key is revoked, a copy left there no longer works. Then tell me exactly what you changed, and do not print any secret values back to me or write one into a commit message, a pull request description or a log.
Then verify: After you deploy the fix, xlogs re-scans your live app and reports whether the key is still found in what it reads. That cannot show the old key was revoked, so revoke it at the provider either way.
Full step-by-step fix guide, with a copy-paste block for each AI tool →
Common questions
Which keys are dangerous to expose?
Any secret key: a Stripe secret key, an OpenAI key, an AWS key, or a Supabase service_role key. These let the holder spend money, read data, or act as your backend. A public key that is designed to ship (like the Supabase anon key) is fine.
I found an exposed key. Is moving it to an env var enough?
No. Assume the exposed value is already compromised. Rotate (regenerate) it at the provider first so the public copy stops working, then move it to a server-only environment variable and remove it from the code and the client bundle.
