Skip to content
BuildThenTestedSee packages

Windsurf app security: defaults, what breaks, what to check

Windsurf, now documented as Devin Desktop by Cognition, is an AI IDE whose Cascade agent edits code, runs commands and can deploy web apps to Netlify. Below: what it configures by default according to its own documentation (verified 2026-09-21), the 15 patterns most associated with it, the security features the vendor offers and where they stop, and a checklist you can run without buying anything.

docs.windsurf.com redirects to docs.devin.ai and the product is now documented as Devin Desktop; the windsurf slug is kept for the hub. Cascade is limited to 20 tool calls per prompt per the overview page.

Windsurf, now documented by Cognition as Devin Desktop, is an AI IDE whose Cascade agent edits code, runs commands and can deploy web apps to Netlify at a windsurf.build URL. Command auto-execution has four levels, from approve-everything to Turbo.

The app is what gets tested. The patterns here are the cross-stack set plus the deploy-path pattern, because one-click deploys to a public URL make it easy to skip the step where someone checks what went live.

What Windsurf sets up by default

Each row is taken from the vendor's documentation on the date shown. Defaults change; the date is the claim.

Defaults of Windsurf as documented by the vendor
AreaDefaultSource
FrontendDevin Desktop (formerly Windsurf) is an AI IDE that imports VS Code or Cursor settings; it does not choose a stack. Repository URLs still use the pre-rebrand windsurf naming.docs · verified 2026-09-21
Command executionCascade offers four auto-execution levels; Disabled requires approval for every command and Turbo auto-executes everything except the deny list. Allow and deny lists are settings, and the deny list takes precedence. The docs do not state which level is default.docs · verified 2026-09-21
HostingApp Deploys publishes to Netlify at a public URL of the form <subdomain>.windsurf.build, with a link to claim the project on your own Netlify account; a windsurf_deployment.yaml file is written to the project root.docs · verified 2026-09-21
Secrets / env varsIndexing ignores .gitignore paths, node_modules and hidden paths by default, and files in .gitignore cannot be edited by the agent. The App Deploys page does not describe environment variable handling.docs · verified 2026-09-21
Source accessAuto-generated memories are stored locally in ~/.codeium/windsurf/memories/ and are not committed to the repository.docs · verified 2026-09-21
Data use for trainingOn paid plans you can opt out on the Data Controls page; after opting out data is not used for training and Zero Data Retention is enabled with model providers. Enterprise data is never used for training without written consent.docs · verified 2026-09-21

Documentation home: docs.devin.ai/desktop/getting-started

What breaks in Windsurf apps

52 patterns in the catalogue name Windsurf; the most severe are listed here across secrets and keys, data access, login and permissions, payments. Attribution is descriptive: the default stack makes the pattern reachable, or a public incident names it.

Public incidents

Lovable reported that from 3 February to 20 April 2026 a backend regression let any logged-in Lovable user read the chat history and source code of public projects; a fix shipped within two hours.

  • 2026-02-03 to 2026-04-20 Exposure window
  • 2026-02-22 First HackerOne report
  • about 2 hours Time from public report to fix

Apr 2026 · Lovable · all sources

One education app built on Lovable had 16 vulnerabilities, 6 critical; a database function denied callers whose role was 'authenticated', so anonymous callers passed and 18,697 user records were readable without login.

  • 16 Vulnerabilities found
  • 6 Critical
  • 18,697 User records exposed
  • 14,928 Unique email addresses
  • 870 Enterprise users with full PII

Feb 2026 · Taimur Khan · all sources

A scan of 1,645 Lovable-built apps found 170 (about 10.3%) with database endpoints readable without login because Supabase row-level security policies were missing or too broad; recorded as CVE-2025-48757, CVSS 9.3.

  • 1,645 Apps scanned
  • 170 Apps with inadequate RLS
  • 10.3% Share of scanned apps
  • 303 Exposed endpoints
  • 9.3 Critical CVSS 3.1 base score (CVE record)
  • 8.26 Researcher's own CVSS base score
  • 2025-03-21 Scan date
  • 2025-05-29 Public disclosure

May 2025 · Matt Palmer (Replit, Inc.) · all sources

Moltbook, a social network for AI agents built with AI-generated code, ran a Supabase database without row-level security policies, leaving 1.5 million API tokens and 35,000 email addresses readable and writable without login.

  • 1.5 million API authentication tokens exposed
  • 35,000 Email addresses exposed
  • about 17,000 Human account owners in database
  • 2026-01-31 Reported to maintainer
  • 2026-01-31 (within about 2 hours) First fix applied

Feb 2026 · Wiz Research · all sources

Each entry links to its primary source in the evidence list. What to do about it is the self-check below.

Windsurf's own security features, and where they stop

Stated from the vendor's documentation. The limits are the vendor's scope statements, not judgements.

  • Terminal allow and deny lists

    windsurf.cascadeCommandsAllowList and windsurf.cascadeCommandsDenyList control which commands auto-execute; Teams and Enterprise admins can enforce a maximum auto-execution level.

    Where it stops: In Turbo mode all commands not on the deny list run immediately.

    vendor docs · verified 2026-09-21

  • Checkpoints and revert

    Named checkpoints of the current state and a revert arrow to undo Cascade edits.

    Where it stops: The docs state reverts are currently irreversible.

    vendor docs · verified 2026-09-21

  • .codeiumignore

    Excludes files from indexing; ignored files also do not count toward the workspace size limit.

    Where it stops: Documented as an indexing control; the page describes edit blocking only for .gitignore entries.

    vendor docs · verified 2026-09-21

  • Zero Data Retention opt-out

    Paid plans can opt out of training and enable Zero Data Retention with model providers; data is encrypted in transit and at rest.

    Where it stops: Opt-out is described for paid plans; the page does not describe the default for free plans.

    vendor docs · verified 2026-09-21

Check it yourself, in this order

The critical patterns first. Each uses the dashboard and your browser.

NEXT_PUBLIC_ prefix on a secret

  1. In your hosting dashboard (Vercel: Project, Settings, Environment Variables) or your .env files, list every variable whose name starts with NEXT_PUBLIC_.
  2. For each one, ask whether the provider calls that value secret, private, server or admin. Stripe secret keys, model provider keys, database passwords and Supabase service_role keys all fall in that group.
  3. Open the live site in Chrome, right-click, choose Inspect, open the Sources tab and press Ctrl+Shift+F. Search for the first few characters of each suspect value.
  4. A bad result is a NEXT_PUBLIC_ variable holding a server-only key, or a search hit for that key's value in a loaded script.

Secrets committed to the code repository

  1. Open your project on GitHub (or the code view in your builder) and look at the file list for .env, .env.local, .env.production, serviceAccountKey.json or firebase-adminsdk files.
  2. Use the repository search box and search for sk_live, sk-, service_role, BEGIN PRIVATE KEY and password=.
  3. If you have the code on your computer, run one command in the project folder: git log --all -p -S sk_live -- . | head. Any output means a live key has been committed at some point.
  4. On GitHub, open Settings, then Code security, and check whether Secret scanning shows alerts.
  5. A bad result is any env or key file in the file list, any search hit that shows a real key, or an open secret scanning alert.

Service-role key shipped in the browser bundle

  1. Open your live app in Chrome, right-click anywhere and choose Inspect, then open the Sources tab.
  2. Press Ctrl+Shift+F (Cmd+Option+F on a Mac) to search every loaded file. Search for service_role and then for sb_secret_.
  3. Open the Network tab, reload the page, click any request whose address contains supabase.co, and read the apikey header under Request Headers.
  4. In the Supabase dashboard, open Project Settings, then API Keys, and compare that header value with your keys.
  5. A bad result is any search hit, or a header value that matches the service_role or secret key rather than the anon or publishable key.

Windsurf pre-launch checklist

52 checks, in the order we run them. Usable without buying anything.

Self-check tool

Answer questions about your app and get the patterns that apply, ordered by severity. Runs in your browser; nothing is sent.

Run the self-check

Packages for Windsurf apps

Pre-launch check

Start here

For founders about to let real users in.

$490

Report in 48 hours
  • Keys and secrets in the browser or repo
  • Who can read and change whose data
  • Login, roles and admin routes
  • Errors, retries and rate limits
  • Debug mode, headers, deploy path

What you receive

Security sweep

For anyone who wants the three riskiest areas checked fast.

$290

Report in 24 hours
  • API keys and secrets in the bundle
  • Row-level rules on every table
  • Cross-user data reads
  • Admin and hidden routes
  • Client-only permission checks

What you receive

All packages and prices. Every report includes a re-check after your fixes.

Questions about Windsurf

windsurf security

Windsurf documents terminal allow and deny lists, checkpoints and revert, .codeiumignore and a Zero Data Retention opt-out. Set the auto-execution level below Turbo for projects with production credentials, and review what App Deploys publishes.

windsurf app audit

We test the deployed app: what the public URL reveals, permission checks on routes, secrets in the bundle, database rules and payments. Fix directions are written to paste into Cascade.

is my windsurf app safe

Run the self-check for your stack on this site. Then check the deployed URL in a private browser window: anything you can reach without logging in, a stranger can reach too.