Security · June 7, 2025

Claude Code App Security: Don't Deploy Publicly

Vibe-coded apps deployed publicly expose company data to anyone with the URL. Here's what to do instead — and how to lock it down in 30 seconds.


You built something with Claude Code. You deployed it to Vercel or Railway. You pasted the URL in Slack. A week later, you realize anyone on the internet can open that URL — including the AI features, the internal API calls, and whatever data it's processing.

This is one of the most common and least-discussed security problems with AI-generated internal tools. Here's what to do about it.

The threat model for vibe-coded apps

Most vibe-coded apps aren't handling regulated data (HIPAA, PCI). But they're often doing things like:

If this app is publicly accessible, anyone who discovers the URL can do all of those things. They can run up your API bill, query your data, and trigger your internal workflows.

The Lovable incident

In early 2025, it became widely known that apps built with Lovable (an AI vibe-coding tool) were deployed publicly by default, with database credentials exposed in client-side JavaScript. Researchers were able to access the databases of hundreds of real companies by simply opening the apps. This wasn't a Lovable bug — it was developers deploying apps without thinking about access control.

The same risk exists for anything you deploy publicly with working API keys.

The fix: company-gated deployment

The simplest fix: deploy to a URL that requires @yourcompany.com email authentication before loading anything. Workshop does this in 30 seconds:

npm install -g @getworkshop/cli
workshop login
cd your-project
workshop init
workshop deploy
# Choose "Company domain" — only @yourcompany.com gets in

Under the hood, Workshop intercepts every request before it reaches your app. If the user hasn't authenticated with a valid @yourcompany.com email, they see a sign-in screen. Your app code, API keys, and data never reach unauthenticated users.

Secrets management

Never put API keys or database credentials in your app bundle or frontend code. Use Workshop's secrets proxy:

workshop secret set OPENAI_API_KEY=sk-...
workshop secret set DATABASE_URL=postgresql://...

Your app reads them via environment variables at runtime. They never appear in the browser, the bundle, or the source code.

Access modes

Default your Claude Code apps to company mode. It takes the same 30 seconds and prevents the entire class of accidental public exposure problems.

Try Workshop

Deploy your internal app in 30 seconds.

Free for one app. No credit card required.

npm install -g @getworkshop/cli && workshop deploy

Get early access → getworkshop.io