<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ide on RockB</title><link>https://baeseokjae.github.io/tags/ide/</link><description>Recent content in Ide on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 23 Apr 2026 01:04:18 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/ide/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Set Up Cursor AI in 2026: Complete Beginner's Guide</title><link>https://baeseokjae.github.io/posts/cursor-ai-setup-guide-2026/</link><pubDate>Thu, 23 Apr 2026 01:04:18 +0000</pubDate><guid>https://baeseokjae.github.io/posts/cursor-ai-setup-guide-2026/</guid><description>Step-by-step Cursor AI setup guide for 2026: install, configure models, master Tab Completion, Composer 2.0, Agent Mode, and .cursorrules in under an hour.</description><content:encoded><![CDATA[<p>Cursor AI is a VS Code fork by Anysphere that adds native AI tab completion, inline editing, multi-file Composer 2.0, and autonomous Agent Mode directly into the editor. Install it in under five minutes, import your existing VS Code settings, pick a model, and you&rsquo;re writing AI-assisted code within the hour.</p>
<h2 id="what-is-cursor-ai-and-why-use-it-in-2026">What Is Cursor AI and Why Use It in 2026?</h2>
<p>Cursor AI is an AI-native code editor built by Anysphere as a direct fork of VS Code, meaning it looks and feels like the editor you already know but replaces every edit surface with AI capabilities. As of 2026, Cursor has crossed 1 million users and 360,000 paying customers — including teams at over 50% of Fortune 500 companies — making it the fastest-adopted developer tool since GitHub Copilot. Version 3.0 shipped Background Agents, Cloud Agents for Business teams, and Composer 2.0, which can coordinate changes across dozens of files in a single guided session. The editor supports macOS 12+, Windows 10+, and Linux, and costs $0 on the free tier (2,000 AI completions/month) or $20/month for Pro with unlimited fast requests. The core value proposition: instead of switching between your editor and a chat window, every interaction — completion, refactoring, debugging, testing — happens inline without context-switching.</p>
<h2 id="system-requirements-and-prerequisites">System Requirements and Prerequisites</h2>
<p>Before downloading, confirm your environment meets the minimum spec. Cursor v3.0 requires macOS 12 Monterey or later, Windows 10 (64-bit) or later, or a modern Linux distribution with a supported desktop environment. On RAM, 8 GB is the bare minimum but 16 GB is strongly recommended — Agent Mode and Background Agents spawn sub-processes that hold model context, which adds memory pressure. An SSD is de facto required; Cursor indexes your codebase on first open and reads from that index on every <code>@</code> mention in Chat. You do not need to install VS Code first — Cursor ships its own Electron runtime. You do need a Cursor account (free to create at cursor.com) to activate the free tier. Teams evaluating the Business tier ($40/user/month) should also check IT policy around privacy mode, which prevents code from being stored in Anysphere&rsquo;s infrastructure.</p>
<h2 id="step-1-download-and-install-cursor">Step 1: Download and Install Cursor</h2>
<p>Cursor&rsquo;s installation follows the same pattern as any desktop app, and the full process takes under five minutes from download to first file open. Navigate to cursor.com, click Download, and the site auto-detects your OS and serves the right binary. The macOS installer is a standard <code>.dmg</code>; drag Cursor.app to Applications. On Windows, run the <code>.exe</code> installer with default options — Cursor adds itself to PATH automatically so you can launch it with <code>cursor .</code> from any terminal. On Linux, download the <code>.AppImage</code>, run <code>chmod +x cursor-*.AppImage</code>, and execute it directly; no root access or system-level install is needed, which makes it portable across machines. After first launch, Cursor prompts you to sign in or create a free account at cursor.com — the sign-up takes about 60 seconds. The free tier activates immediately with no credit card required: you get 2,000 fast AI completions and 50 slow requests per month, which is enough to evaluate all the core features. Once authenticated, you land in the welcome flow, which offers to import your VS Code settings and extensions. Accept this step — it&rsquo;s covered in detail in Step 2. You&rsquo;ll configure the AI model selection in Step 3.</p>
<h2 id="step-2-import-vs-code-settings-and-extensions">Step 2: Import VS Code Settings and Extensions</h2>
<p>Cursor reads your VS Code configuration directly from disk, so the transition is near-instant. In the welcome modal, click &ldquo;Import VS Code Settings.&rdquo; Cursor locates your VS Code <code>settings.json</code>, <code>keybindings.json</code>, and installed extensions and copies them into its own profile directory. Extensions that depend on the VS Code extension API work unchanged — language servers, linters, formatters, Git integrations, theme packs. Extensions that call VS Code-proprietary APIs (a small minority) may not load; Cursor logs these in the Output panel under &ldquo;Extensions.&rdquo; After import, open any project you were working on in VS Code and the experience should be identical — same file tree, same color scheme, same shortcuts — plus the new AI sidebar on the left. If you don&rsquo;t have a VS Code installation to import from, skip this step; Cursor&rsquo;s defaults are sensible.</p>
<h2 id="step-3-configure-ai-models-for-different-tasks">Step 3: Configure AI Models for Different Tasks</h2>
<p>Cursor routes requests to different models depending on the task type, and configuring this correctly is the single highest-leverage setup step. Open Settings (<code>Cmd/Ctrl + ,</code>) and navigate to <strong>Cursor &gt; Models</strong>. For Tab Completion — low-latency predictions that fire on every keystroke — use a fast small model: Cursor&rsquo;s default <code>cursor-small</code> is purpose-built for sub-100ms latency. For Chat and Composer, where you&rsquo;re asking questions or orchestrating multi-file edits, route to a frontier model: Claude Sonnet 4.6 is the 2026 default for most teams because it balances reasoning quality with speed. For Agent Mode tasks that run autonomously over many steps, Claude Opus 4.7 or GPT-4o give better multi-step coherence. You can also connect your own API keys for OpenAI, Anthropic, or Google under <strong>Cursor &gt; AI Keys</strong> — useful for Business teams that need per-org billing or want to use models not in Cursor&rsquo;s default list. Set a monthly spend cap under <strong>Cursor &gt; Billing</strong> to avoid surprises.</p>
<table>
  <thead>
      <tr>
          <th>Use Case</th>
          <th>Recommended Model</th>
          <th>Why</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Tab Completion</td>
          <td>cursor-small</td>
          <td>Sub-100ms latency, purpose-trained</td>
      </tr>
      <tr>
          <td>Chat Q&amp;A</td>
          <td>Claude Sonnet 4.6</td>
          <td>Fast reasoning, large context</td>
      </tr>
      <tr>
          <td>Composer edits</td>
          <td>Claude Sonnet 4.6</td>
          <td>Multi-file coherence</td>
      </tr>
      <tr>
          <td>Agent Mode</td>
          <td>Claude Opus 4.7</td>
          <td>Long-horizon planning</td>
      </tr>
      <tr>
          <td>Budget mode</td>
          <td>GPT-4o mini</td>
          <td>Cheap, adequate for simple tasks</td>
      </tr>
  </tbody>
</table>
<h2 id="step-4-master-tab-completion-with-multi-line-predictions">Step 4: Master Tab Completion with Multi-Line Predictions</h2>
<p>Cursor&rsquo;s Tab Completion is the feature most developers notice first — and it behaves differently from GitHub Copilot&rsquo;s single-line suggestions. Cursor predicts multi-line completions and adapts them to the exact cursor position, surrounding code, and recent edits within the file. The key interaction model: start typing, see the grey ghost text, press <code>Tab</code> to accept the full suggestion, or <code>Ctrl+Right</code> to accept one word at a time. Press <code>Esc</code> to dismiss. If the suggestion is wrong, just keep typing — Cursor re-predicts within ~200ms. Practical technique: write a comment explaining what you want (<code>// fetch user by email, return null if not found</code>), then press <code>Enter</code> and <code>Tab</code>. Cursor often generates the entire function body. For repetitive patterns — adding type annotations, writing test cases for a new function — let Tab Completion do the structural work while you focus on correctness. The free tier allows 2,000 completions/month; Pro gives unlimited fast completions.</p>
<h2 id="step-5-inline-editing-with-cmdk">Step 5: Inline Editing with Cmd+K</h2>
<p>Inline editing via <code>Cmd+K</code> (Mac) or <code>Ctrl+K</code> (Windows/Linux) is Cursor&rsquo;s most surgical AI tool. Select any code, press the shortcut, and a small prompt bar appears inline — no chat panel, no context switch. Type your instruction (&ldquo;make this async&rdquo;, &ldquo;add error handling&rdquo;, &ldquo;rename all params to camelCase&rdquo;, &ldquo;convert to TypeScript&rdquo;) and press <code>Enter</code>. Cursor streams the edit directly into the selected region with a diff view — green for additions, red for deletions. Press <code>Tab</code> to accept or <code>Esc</code> to reject. For whole-file operations without a selection, press <code>Cmd+K</code> with nothing selected; Cursor operates on the visible viewport. Practical patterns: highlight a function and ask &ldquo;add JSDoc with param types,&rdquo; select a SQL query and ask &ldquo;rewrite as parameterized to prevent injection,&rdquo; or select a test file and ask &ldquo;add edge cases for null and empty inputs.&rdquo; Cmd+K round-trips in ~2–5 seconds for most edits, making it faster than opening a separate chat for small transformations.</p>
<h2 id="step-6-chat-with-codebase-context-using-mentions">Step 6: Chat with Codebase Context Using @Mentions</h2>
<p>Cursor&rsquo;s Chat panel (<code>Cmd+L</code>) is a conversation interface with full codebase awareness via the <code>@</code> mention system. Unlike generic chatbots, Chat knows about your repo structure because Cursor indexes it locally on first open. Type <code>@</code> to see a menu of mentionable context types: <code>@Files</code> for specific files, <code>@Folders</code> for directories, <code>@Codebase</code> for a semantic search across the whole repo, <code>@Docs</code> for framework documentation, <code>@Web</code> for live web search, and <code>@Git</code> for recent diffs and commit history. Practical example: <code>@Codebase how does authentication middleware work in this project?</code> returns a grounded answer pointing to actual file paths, not generic advice. Use Chat for orientation questions (&ldquo;what does this function call chain do?&rdquo;), architecture decisions (&ldquo;should I put this in a service or a hook?&rdquo;), and code review (&quot;@Files src/api/users.ts review this for security issues&quot;). Chat messages persist in a session thread; start a new chat (<code>Cmd+Shift+L</code>) when switching topics to avoid polluting context.</p>
<h2 id="step-7-build-multi-file-features-with-composer-20">Step 7: Build Multi-File Features with Composer 2.0</h2>
<p>Composer 2.0 (<code>Cmd+I</code>) is Cursor&rsquo;s answer to multi-file AI editing — it can open, read, modify, and create files across your entire project in a single guided session. Describe a feature at a high level (&ldquo;add a password reset flow with email verification, a reset token model, and two new API routes&rdquo;) and Composer generates a plan, lists the files it will touch, and asks for confirmation before writing. You review each change as it streams in, can edit the prompt mid-session to redirect (&ldquo;actually store the token in Redis, not the database&rdquo;), and accept or reject per-file. Composer 2.0 improvements over v1: better plan coherence across more than 10 files, checkpoint saves so you can roll back to any step, and integration with Agent Mode for tasks that require running commands. Use Composer for new features, large refactors, and test generation across multiple files. Avoid it for tiny changes — Cmd+K is faster for single-function edits.</p>
<h2 id="step-8-set-up-cursorrules-for-persistent-project-context">Step 8: Set Up .cursorrules for Persistent Project Context</h2>
<p><code>.cursorrules</code> is a plain text file at your project root that Cursor injects into every AI request as system context. Think of it as a persistent prompt that keeps the AI aligned with your project conventions without you repeating them in every chat. Create the file at <code>&lt;project-root&gt;/.cursorrules</code> and write your rules in plain English. Effective rules are specific: instead of &ldquo;write good code,&rdquo; write &ldquo;use TypeScript strict mode, never use <code>any</code>, prefer <code>Result&lt;T, E&gt;</code> types over throwing exceptions, and follow the repository pattern for all database access.&rdquo; Include stack-specific rules: &ldquo;this project uses Prisma for ORM, not raw SQL,&rdquo; &ldquo;always use React Query for server state, never useEffect for fetching,&rdquo; &ldquo;tests use Vitest and Testing Library, not Jest.&rdquo; Teams should version-control <code>.cursorrules</code> and treat it like a <code>CONTRIBUTING.md</code> that the AI also reads. After saving the file, restart Chat or Composer to pick up the new rules — they don&rsquo;t hot-reload mid-session in v3.0.</p>
<h2 id="step-9-use-agent-mode-for-autonomous-task-execution">Step 9: Use Agent Mode for Autonomous Task Execution</h2>
<p>Agent Mode is Cursor&rsquo;s highest-autonomy feature — it gives the AI control of the terminal, file system, and editor to complete tasks end-to-end without step-by-step confirmation. Enable it in Composer by toggling &ldquo;Agent&rdquo; in the dropdown, or open the dedicated Agent panel. In Agent Mode, Cursor can run shell commands (<code>npm install</code>, <code>git commit</code>, <code>python script.py</code>), read command output, react to errors by editing code and retrying, and loop until the task succeeds or hits a limit. A practical workflow: &ldquo;set up a new Express API project with TypeScript, ESLint, Prettier, and a health-check endpoint, then run the tests to verify.&rdquo; Agent Mode handles everything — scaffolding, dependency install, config files, test execution. Guardrails: Agent Mode asks for permission before destructive operations (deleting files, force-pushing) by default. For production work, keep terminal sandboxing on and review the command log after each session. Background Agents (Business tier) run the same way but in Anysphere&rsquo;s cloud infrastructure, freeing your local machine.</p>
<h2 id="step-10-debug-and-test-with-ai-assistance">Step 10: Debug and Test with AI Assistance</h2>
<p>Cursor integrates AI into the debugging loop in two useful ways. First, when your terminal shows an error, paste it into Chat with <code>@</code> pointing to the relevant file: <code>@Files src/server.ts TypeError: Cannot read properties of undefined (reading 'id') — what's wrong?</code> Cursor analyzes the stack trace, locates the code path, and proposes a fix you can apply with one click. Second, use Composer to generate test suites: select a module and ask &ldquo;write unit tests covering the happy path, null inputs, and network error cases.&rdquo; Composer generates the test file, runs it with your test runner if Agent Mode is on, and fixes failures automatically. For integration tests that require a database, tell Composer explicitly: &ldquo;use a test database connection from the <code>TEST_DATABASE_URL</code> env var.&rdquo; Test generation quality is highest when <code>.cursorrules</code> specifies your test framework (Vitest, Jest, Pytest, etc.) so Cursor uses the right APIs from the start.</p>
<h2 id="step-11-integrate-with-git-and-terminal">Step 11: Integrate with Git and Terminal</h2>
<p>Cursor&rsquo;s terminal is the standard VS Code integrated terminal — <code>Cmd+\`` opens it — with one addition: the AI terminal command feature. Press </code>Cmd+K<code>inside the terminal to describe what you want to do (&quot;list all branches merged in the last 7 days and delete the ones not on main&quot;) and Cursor translates it to a shell command for review before execution. You can reject, edit, or run the command. For Git workflows, Cursor's Source Control panel (the branch icon in the left sidebar) adds AI-generated commit messages: stage your changes, click the sparkle icon in the commit message box, and Cursor summarizes the diff into a conventional commit message. For PR descriptions, use Chat with</code>@Git diff main<code>to get a summary of all changes since your branch diverged. If your team uses GitHub Actions or GitLab CI, store pipeline configs in the repo and reference them in</code>.cursorrules` so Cursor understands your CI constraints when generating code.</p>
<h2 id="step-12-optimize-performance-and-keyboard-shortcuts">Step 12: Optimize Performance and Keyboard Shortcuts</h2>
<p>Performance tuning and shortcut fluency separate power users from beginners. For indexing performance: open Settings &gt; Cursor &gt; Indexing and add <code>node_modules</code>, <code>dist</code>, <code>.next</code>, and any large generated directories to the ignore list. Large ignored directories speed up both indexing and <code>@Codebase</code> search significantly. For model routing: if you notice Chat responses are slow, switch the Chat model from Opus to Sonnet for a 3–4x speed improvement on most queries. For keyboard shortcuts, the five highest-ROI bindings to memorize are: <code>Cmd+K</code> (inline edit), <code>Cmd+L</code> (open Chat), <code>Cmd+I</code> (open Composer), <code>Cmd+Shift+L</code> (new Chat thread), and <code>Tab</code> (accept completion). You can customize all of these in <code>Preferences &gt; Keyboard Shortcuts</code>. For teams, share a <code>keybindings.json</code> in the repo alongside <code>.cursorrules</code> so everyone uses consistent bindings.</p>
<h2 id="pricing-breakdown-free-vs-pro-vs-business-2026">Pricing Breakdown: Free vs Pro vs Business (2026)</h2>
<p>Cursor&rsquo;s pricing in 2026 reflects its position as a productivity tool rather than a toy. The free tier is genuinely useful — 2,000 fast AI completions/month and 50 slow requests covers light personal projects. Pro at $20/month removes most limits: unlimited fast completions, 500 fast Composer requests, and access to all frontier models. Business at $40/user/month adds privacy mode (code never leaves your org), SSO/SAML, centralized billing, audit logs, and Cloud Agents. Most individual developers land on Pro. Teams that process proprietary code or work in regulated industries (finance, healthcare, defense) need Business for the privacy guarantees.</p>
<table>
  <thead>
      <tr>
          <th>Tier</th>
          <th>Price</th>
          <th>Fast Completions</th>
          <th>Composer</th>
          <th>Privacy Mode</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Free</td>
          <td>$0</td>
          <td>2,000/month</td>
          <td>10 sessions</td>
          <td>No</td>
      </tr>
      <tr>
          <td>Pro</td>
          <td>$20/month</td>
          <td>Unlimited</td>
          <td>500 fast/month</td>
          <td>No</td>
      </tr>
      <tr>
          <td>Business</td>
          <td>$40/user/month</td>
          <td>Unlimited</td>
          <td>Unlimited</td>
          <td>Yes</td>
      </tr>
  </tbody>
</table>
<h2 id="5-common-cursor-pitfalls-and-how-to-avoid-them">5 Common Cursor Pitfalls and How to Avoid Them</h2>
<p><strong>1. Accepting completions without reading them.</strong> Tab Completion is fast but not infallible. Pause for one second before accepting multi-line suggestions, especially in security-critical code (auth, input validation, SQL). Use <code>Ctrl+Right</code> to accept word-by-word when unsure.</p>
<p><strong>2. Not setting <code>.cursorrules</code>.</strong> Without project context, Cursor defaults to generic patterns that may conflict with your stack. The first 30 minutes you invest in a good <code>.cursorrules</code> file returns hours of avoided corrections.</p>
<p><strong>3. Using Composer for tiny edits.</strong> Composer&rsquo;s strength is multi-file coordination. For single-function changes, Cmd+K is 5x faster. Match the tool to the scope.</p>
<p><strong>4. Running Agent Mode without reviewing the command log.</strong> Agent Mode is powerful but can install unexpected packages or modify config files. Review the terminal log after every agent session before committing.</p>
<p><strong>5. Ignoring the <code>@Codebase</code> context type.</strong> Most beginners chat without <code>@</code> mentions and get generic answers. Adding <code>@Codebase</code> or <code>@Files</code> turns generic advice into project-specific guidance grounded in your actual code.</p>
<h2 id="troubleshooting-common-issues">Troubleshooting Common Issues</h2>
<p><strong>Cursor won&rsquo;t index my codebase.</strong> Check Settings &gt; Cursor &gt; Indexing &gt; Ignored Paths. If <code>node_modules</code> or a large generated directory is being indexed, the indexer stalls. Add the directory to the ignore list and trigger a manual reindex via Command Palette &gt; &ldquo;Cursor: Reindex Codebase.&rdquo;</p>
<p><strong>Tab Completion stopped working.</strong> First check your free tier usage — 2,000 completions/month resets on the billing date, not the calendar month. Open Cursor&rsquo;s account dashboard to verify. If usage is fine, toggle the completion model in Settings and back again to reset the connection.</p>
<p><strong>Composer applies changes to the wrong files.</strong> This usually means Cursor&rsquo;s <code>@Codebase</code> index is stale. Reindex (Command Palette &gt; &ldquo;Cursor: Reindex Codebase&rdquo;) and retry. Also verify <code>.cursorrules</code> doesn&rsquo;t have contradictory file path instructions.</p>
<p><strong>Agent Mode terminal commands fail silently.</strong> Check that your shell profile (<code>.zshrc</code>, <code>.bashrc</code>) is sourced in non-interactive shells. Some tools (nvm, pyenv, rbenv) only activate in interactive shells. Add explicit <code>source ~/.zshrc</code> at the top of Agent Mode sessions or configure Cursor to use your full shell path.</p>
<h2 id="advanced-tips-for-power-users">Advanced Tips for Power Users</h2>
<p><strong>Multi-root workspaces:</strong> Open multiple related repos in one Cursor window via File &gt; Add Folder to Workspace. <code>@Codebase</code> searches across all roots, and Composer can edit files in any root. Useful for monorepo setups where the API and frontend are separate repos.</p>
<p><strong>Model routing by file type:</strong> In Settings &gt; Cursor &gt; Models, you can assign different models per language. Use a smaller, faster model for plain-text files (markdown, JSON config) and reserve frontier models for TypeScript/Python where reasoning quality matters.</p>
<p><strong>MCP integrations:</strong> Cursor v3.0 supports Model Context Protocol servers — plugins that extend Chat and Agent Mode with external tool access (GitHub PRs, Linear tickets, Notion docs, database queries). Install community MCP servers from the Cursor marketplace or write your own using the MCP SDK.</p>
<p><strong>Shared team <code>.cursorrules</code>:</strong> For larger teams, store project-specific rules in <code>.cursorrules</code> at the repo root and personal preferences in <code>~/.cursor/rules/global.md</code>. Both are merged at request time — project rules take precedence on conflicts.</p>
<h2 id="faq">FAQ</h2>
<p><strong>Is Cursor AI free to use?</strong>
Yes. The free tier gives 2,000 fast AI completions and 50 slow requests per month, which covers light personal use. Pro ($20/month) removes most limits and is what most active developers use.</p>
<p><strong>Does Cursor replace VS Code completely?</strong>
Cursor is a fork of VS Code, so it retains all VS Code functionality — extensions, keybindings, themes, language servers. You can import your VS Code settings with one click. Most developers use Cursor as a drop-in replacement and don&rsquo;t keep VS Code installed.</p>
<p><strong>Is my code sent to Anysphere&rsquo;s servers?</strong>
On the free and Pro tiers, code snippets and context are sent to AI model providers (Anthropic, OpenAI) to generate responses. Anysphere states it does not train on user code. The Business tier adds Privacy Mode, which routes requests through an isolated pipeline with contractual guarantees that code is not retained.</p>
<p><strong>Can I use my own OpenAI or Anthropic API key?</strong>
Yes. Under Settings &gt; Cursor &gt; AI Keys, you can add your own API keys for OpenAI, Anthropic, or Google. This lets you use models not in Cursor&rsquo;s default list and bills usage directly to your API account rather than your Cursor subscription.</p>
<p><strong>How is Cursor different from GitHub Copilot?</strong>
Copilot is a VS Code extension that adds single-line completions and a chat sidebar. Cursor is a full editor fork with multi-line Tab Completion, Cmd+K inline editing, Composer 2.0 for multi-file features, and Agent Mode for autonomous task execution. Cursor&rsquo;s context system (<code>@Codebase</code>, <code>@Git</code>, <code>@Docs</code>) is also significantly more powerful than Copilot&rsquo;s workspace context.</p>
]]></content:encoded></item><item><title>How to Set Up Windsurf IDE 2026: Installation, Config, and First Project</title><link>https://baeseokjae.github.io/posts/windsurf-setup-tutorial-2026/</link><pubDate>Sat, 18 Apr 2026 05:16:15 +0000</pubDate><guid>https://baeseokjae.github.io/posts/windsurf-setup-tutorial-2026/</guid><description>Complete guide to setup Windsurf IDE 2026 — install on macOS, Windows, or Linux, configure .windsurfrules, and run your first Cascade flow.</description><content:encoded><![CDATA[<p>Windsurf IDE is a production-ready AI-native code editor that reached 1M+ active users by March 2026. Unlike VS Code with an AI plugin bolted on, Windsurf was designed from scratch around Cascade — an autonomous agent that plans multi-step tasks, runs terminal commands, and iterates on its own. Setting it up correctly takes about 20 minutes and the defaults are conservative on purpose. Here&rsquo;s exactly how to do it.</p>
<h2 id="what-makes-windsurf-different-from-other-ai-editors">What Makes Windsurf Different From Other AI Editors?</h2>
<p>Windsurf is an AI-native IDE built around Cascade, an autonomous agent that can plan multi-step workflows, execute terminal commands, read files across your entire repo, and iterate without waiting for step-by-step instructions. By March 2026, Windsurf had 1M+ active users generating 70M+ lines of AI-written code per day, with 94% of its code output being AI-generated. Unlike GitHub Copilot (which autocompletes inline) or Cursor (which focuses on precision edit suggestions), Windsurf&rsquo;s core value proposition is agentic autonomy: describe an outcome, and Cascade plans and executes the path to get there. ServiceNow deployed Windsurf across ~7,000 engineers and saw a 10% productivity boost. The fundamental distinction is philosophy — Windsurf optimizes for &ldquo;describe what you want&rdquo; workflows, while Cursor optimizes for &ldquo;precise, surgical edits.&rdquo; If your team produces greenfield features or prototypes frequently, Windsurf&rsquo;s architecture pays off. If you do mostly targeted refactors on large mature codebases, the tradeoff is different.</p>
<h2 id="system-requirements-before-you-install">System Requirements Before You Install</h2>
<p>Before downloading, confirm your machine meets the minimum specs. Windsurf runs on any modern hardware but performs noticeably better with adequate RAM. The tool&rsquo;s idle memory footprint is ~1.1GB and cold start time is approximately 3.4 seconds on a modern machine — the AI completion latency runs 102ms, fast enough that it doesn&rsquo;t interrupt flow. On 8GB RAM machines running Codebase context mode on large repos, expect slowdown during the initial embedding scan because Windsurf indexes your entire repository before enabling full multi-file awareness.</p>
<p><strong>Minimum requirements:</strong></p>
<ul>
<li>macOS: OS X Yosemite (10.10) or later</li>
<li>Windows: Windows 10 64-bit or later</li>
<li>Linux: Ubuntu 18.04+ or equivalent glibc 2.17+ distribution</li>
<li>RAM: 8GB minimum</li>
<li>RAM: 16GB recommended if you plan to use Codebase context mode on projects over 10k lines</li>
</ul>
<p>If you&rsquo;re on 8GB RAM and plan to run Codebase context mode on large repos, expect some slowdown during the initial embedding scan. You can work around this with a <code>.codeiumignore</code> file to exclude <code>node_modules</code>, <code>dist</code>, <code>.git</code>, and other large generated directories from the index.</p>
<h2 id="step-1-download-and-install-windsurf">Step 1: Download and Install Windsurf</h2>
<p>Download Windsurf from the official site (windsurf.com) for your platform. All three major platforms are supported with native packages. Installation is straightforward but there are a few platform-specific gotchas worth knowing before you start, particularly on macOS where Gatekeeper may block the first launch and on Linux where the apt repository setup requires a few extra commands.</p>
<p><strong>macOS:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>brew install --cask windsurf
</span></span></code></pre></div><p>Or download the <code>.dmg</code> directly. If macOS Gatekeeper blocks the app on first launch, go to <strong>System Settings → Privacy &amp; Security</strong> and click &ldquo;Open Anyway.&rdquo; This is expected for apps downloaded outside the App Store.</p>
<p><strong>Ubuntu / Debian Linux:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Add the Codeium apt repository</span>
</span></span><span style="display:flex;"><span>curl -fsSL https://windsurf-stable.codeiumdata.com/wVxQEIWkwPUEAGf3/windsurf.gpg <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  | sudo gpg --dearmor -o /usr/share/keyrings/windsurf-stable-archive-keyring.gpg
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;deb [signed-by=/usr/share/keyrings/windsurf-stable-archive-keyring.gpg arch=amd64] \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  https://windsurf-stable.codeiumdata.com/wVxQEIWkwPUEAGf3/apt stable main&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  | sudo tee /etc/apt/sources.list.d/windsurf.list &gt; /dev/null
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>sudo apt-get update <span style="color:#f92672">&amp;&amp;</span> sudo apt-get install windsurf
</span></span></code></pre></div><p><strong>Windows:</strong>
Download the <code>.exe</code> installer from windsurf.com and run it. Windsurf installs to <code>%LOCALAPPDATA%\Programs\Windsurf</code> by default.</p>
<h2 id="step-2-complete-the-onboarding-flow">Step 2: Complete the Onboarding Flow</h2>
<p>When Windsurf launches for the first time, it walks you through a 4-step onboarding that sets up your core preferences. This is worth doing carefully — the choices here save you configuration time later. The onboarding sequence takes about 3-5 minutes, and you can import your existing VS Code or Cursor setup at this stage rather than rebuilding your configuration from scratch. Windsurf copies your extensions list, keybindings, and settings.json automatically during the import, which means most developers are functional within minutes rather than spending an hour reconfiguring their environment.</p>
<p><strong>Onboarding steps:</strong></p>
<ol>
<li><strong>Setup path</strong> — Choose one: &ldquo;Start fresh,&rdquo; &ldquo;Import from VS Code,&rdquo; or &ldquo;Import from Cursor.&rdquo; If you&rsquo;re migrating, pick the import option.</li>
<li><strong>Theme selection</strong> — Dark, light, or high-contrast. This can be changed anytime.</li>
<li><strong>Keybindings</strong> — Choose VS Code keybindings (default) or Vim bindings. Vim users: select this now.</li>
<li><strong>Account creation / login</strong> — Sign up for a free account at codeium.com or log in. The free tier gives you 25 Cascade flow actions per month.</li>
</ol>
<p>If you skipped the VS Code import during onboarding, trigger it afterward via the Command Palette (<code>Cmd+Shift+P</code> / <code>Ctrl+Shift+P</code>): search &ldquo;Import VS Code Settings.&rdquo; Note that other AI completion extensions (GitHub Copilot, Tabnine) and proprietary language server extensions are incompatible with Windsurf and will be flagged during import.</p>
<h2 id="step-3-create-your-windsurfrules-file">Step 3: Create Your .windsurfrules File</h2>
<p>The <code>.windsurfrules</code> file is the single highest-leverage configuration in Windsurf. It lives at your project root and tells Cascade your stack, coding conventions, file structure boundaries, and constraints — before every single prompt. Teams that skip this file spend 2-3x more tokens repeating context. Teams that write a good <code>.windsurfrules</code> file cut their prompt length in half and see dramatically more consistent output from Cascade. Think of it as a permanent system prompt that applies to every Cascade interaction in your project. Unlike one-off instructions in a chat window, <code>.windsurfrules</code> is committed to git, visible to your whole team, and applied automatically without requiring anyone to remember to include it.</p>
<p>Create it at your project root:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>touch .windsurfrules
</span></span></code></pre></div><p>A practical starter template for a Node.js/TypeScript project:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 688 329"
      >
      <g transform='translate(8,16)'>
<path d='M 0,192 L 8,192' fill='none' stroke='currentColor'></path>
<path d='M 0,208 L 8,208' fill='none' stroke='currentColor'></path>
<path d='M 0,224 L 8,224' fill='none' stroke='currentColor'></path>
<path d='M 0,240 L 8,240' fill='none' stroke='currentColor'></path>
<path d='M 264,128 L 272,112' fill='none' stroke='currentColor'></path>
<circle cx='264' cy='128' r='6' stroke='currentColor' fill='#fff'></circle>
<circle cx='280' cy='112' r='6' stroke='currentColor' fill='currentColor'></circle>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>#</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='84' fill='currentColor' style='font-size:1em'>#</text>
<text text-anchor='middle' x='0' y='100' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='116' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='132' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='148' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='180' fill='currentColor' style='font-size:1em'>#</text>
<text text-anchor='middle' x='0' y='276' fill='currentColor' style='font-size:1em'>#</text>
<text text-anchor='middle' x='0' y='292' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='0' y='308' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>J</text>
<text text-anchor='middle' x='16' y='84' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='16' y='100' fill='currentColor' style='font-size:1em'>U</text>
<text text-anchor='middle' x='16' y='116' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='16' y='132' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='16' y='148' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='16' y='180' fill='currentColor' style='font-size:1em'>F</text>
<text text-anchor='middle' x='16' y='196' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='16' y='212' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='16' y='228' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='16' y='244' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='16' y='276' fill='currentColor' style='font-size:1em'>B</text>
<text text-anchor='middle' x='16' y='292' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='16' y='308' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='24' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='24' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='24' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='24' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='24' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='24' y='180' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='24' y='196' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='24' y='212' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='24' y='228' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='24' y='244' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='24' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='24' y='292' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='24' y='308' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='32' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='32' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='32' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='32' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='148' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='32' y='180' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='32' y='196' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='212' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='228' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='244' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='276' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='40' y='84' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='40' y='132' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='180' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='196' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='212' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='228' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='244' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='276' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='40' y='292' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='40' y='308' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='48' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='48' y='116' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='48' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='48' y='148' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='48' y='196' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='48' y='212' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='48' y='228' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='48' y='244' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='48' y='276' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='48' y='292' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='48' y='308' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='56' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='56' y='180' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='196' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='56' y='212' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='56' y='228' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='244' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='56' y='276' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='56' y='292' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='56' y='308' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='64' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='64' y='100' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='64' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='64' y='132' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='64' y='148' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='64' y='180' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='64' y='196' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='64' y='212' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='64' y='228' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='64' y='244' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='64' y='276' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='72' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='72' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='72' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='72' y='132' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='72' y='148' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='72' y='180' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='72' y='196' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='72' y='228' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='72' y='244' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='72' y='276' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='72' y='292' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='72' y='308' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>Q</text>
<text text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='80' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='80' y='116' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='80' y='132' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='80' y='148' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='80' y='180' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='80' y='196' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='212' fill='currentColor' style='font-size:1em'>—</text>
<text text-anchor='middle' x='80' y='228' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='80' y='244' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='276' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='292' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='80' y='308' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='88' y='100' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='88' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='88' y='132' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='88' y='148' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='88' y='180' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='88' y='196' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='228' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='88' y='244' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='88' y='276' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='88' y='292' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='88' y='308' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='96' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='96' y='132' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='96' y='148' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='96' y='180' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='96' y='196' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='96' y='212' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='96' y='228' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='96' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='96' y='308' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='104' y='100' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='104' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='132' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='104' y='148' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='104' y='180' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='104' y='212' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='104' y='228' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='244' fill='currentColor' style='font-size:1em'>—</text>
<text text-anchor='middle' x='104' y='292' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='104' y='308' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='112' y='132' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='112' y='180' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='112' y='196' fill='currentColor' style='font-size:1em'>—</text>
<text text-anchor='middle' x='112' y='212' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='112' y='228' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='112' y='292' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='112' y='308' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='120' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='120' y='132' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='120' y='148' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='120' y='180' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='212' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='120' y='244' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='128' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='128' y='132' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='128' y='148' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='128' y='196' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='128' y='212' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='128' y='228' fill='currentColor' style='font-size:1em'>—</text>
<text text-anchor='middle' x='128' y='244' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='128' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='128' y='308' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='136' y='100' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='136' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='136' y='148' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='136' y='196' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='136' y='212' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='136' y='244' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='136' y='292' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='136' y='308' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='144' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='144' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='144' y='148' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='144' y='196' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='144' y='212' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='144' y='228' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='144' y='244' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='144' y='292' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='144' y='308' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='152' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='152' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='152' y='132' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='152' y='148' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='152' y='196' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='152' y='212' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='152' y='228' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='152' y='244' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='152' y='308' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='160' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='160' y='148' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='160' y='196' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='228' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='160' y='244' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='160' y='292' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='160' y='308' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='168' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='168' y='100' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='168' y='116' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='168' y='132' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='196' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='168' y='212' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='168' y='228' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='168' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='168' y='308' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='176' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='176' y='132' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='176' y='148' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='176' y='196' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='176' y='212' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='176' y='228' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='176' y='244' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='176' y='292' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='176' y='308' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='184' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='184' y='148' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='184' y='212' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='228' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='244' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='184' y='292' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='308' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='192' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='192' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='192' y='148' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='192' y='196' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='192' y='212' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='192' y='228' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='192' y='244' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='192' y='308' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='200' y='20' fill='currentColor' style='font-size:1em'>5</text>
<text text-anchor='middle' x='200' y='36' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>+</text>
<text text-anchor='middle' x='200' y='100' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='200' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='200' y='132' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='200' y='148' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='200' y='196' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='200' y='212' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='200' y='228' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='200' y='244' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='200' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='200' y='308' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>Q</text>
<text text-anchor='middle' x='208' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='208' y='132' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='208' y='196' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='208' y='212' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='208' y='244' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='208' y='292' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='308' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='216' y='20' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='216' y='100' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='216' y='116' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='216' y='132' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='216' y='148' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='216' y='196' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='216' y='212' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='216' y='228' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='216' y='244' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='216' y='308' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='224' y='36' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='224' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='224' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='224' y='132' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='224' y='148' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='224' y='196' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='224' y='228' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='224' y='244' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='224' y='292' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='232' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='232' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='232' y='148' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='232' y='228' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='232' y='244' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='232' y='292' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='232' y='308' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='240' y='20' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='240' y='100' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='240' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='240' y='132' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='240' y='148' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='240' y='196' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='240' y='228' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='240' y='244' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='240' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='240' y='308' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='248' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='248' y='100' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='248' y='116' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='248' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='248' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='248' y='196' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='248' y='228' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='248' y='244' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='248' y='292' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='256' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='256' y='116' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='256' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='256' y='148' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='256' y='196' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='256' y='292' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='256' y='308' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='264' y='116' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='264' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='196' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='264' y='244' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='264' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='264' y='308' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='272' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='272' y='100' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='272' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='272' y='148' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='272' y='196' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='272' y='244' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='272' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='272' y='308' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='280' y='36' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='280' y='132' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='280' y='148' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='280' y='196' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='280' y='244' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='280' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='280' y='308' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='288' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='288' y='116' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='288' y='132' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='288' y='148' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='288' y='196' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='288' y='244' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='288' y='292' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='288' y='308' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='296' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='296' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='296' y='196' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='296' y='244' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='296' y='292' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='296' y='308' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='304' y='20' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='304' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='304' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='304' y='132' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='304' y='292' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='304' y='308' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='312' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='312' y='132' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='312' y='308' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='320' y='20' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='320' y='116' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='320' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='320' y='292' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='320' y='308' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='328' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='328' y='132' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='328' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='328' y='308' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='336' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='336' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='336' y='132' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='336' y='292' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='336' y='308' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='344' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='344' y='292' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='344' y='308' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='352' y='132' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='292' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='352' y='308' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='308' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='368' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='368' y='292' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='368' y='308' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='376' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='376' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='376' y='292' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='376' y='308' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='384' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='384' y='132' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='384' y='308' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='392' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='392' y='132' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='392' y='292' fill='currentColor' style='font-size:1em'>—</text>
<text text-anchor='middle' x='400' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='408' y='132' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='408' y='292' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='416' y='292' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='424' y='132' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='424' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='432' y='132' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='432' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='440' y='132' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='440' y='292' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='448' y='132' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='456' y='132' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='456' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='472' y='292' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='480' y='292' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='488' y='292' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='504' y='292' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='512' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='520' y='292' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='528' y='292' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='536' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='544' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='552' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='560' y='292' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='568' y='292' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='584' y='292' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='592' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='600' y='292' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='608' y='292' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='624' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='632' y='292' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='640' y='292' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='648' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='656' y='292' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='664' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='672' y='292' fill='currentColor' style='font-size:1em'>d</text>
</g>

    </svg>
  
</div>
<p>The more specific your rules, the better Cascade&rsquo;s output. Include your exact library versions, the things your team has decided never to do, and where each concern lives in the repo.</p>
<h2 id="step-4-configure-cascade-context-mode">Step 4: Configure Cascade Context Mode</h2>
<p>Cascade has three context modes that control how much of your codebase it reads before generating. Choosing the wrong one is the most common reason Windsurf feels slow or produces inaccurate suggestions. The default is File mode — Cascade reads only your currently open file — which is deliberately conservative. For most real development work where features span multiple files, you&rsquo;ll want to switch to Codebase mode. The mode you choose has a direct impact on both response quality and machine performance, so understanding the tradeoffs before you start using Cascade seriously is worth 5 minutes of your time.</p>
<table>
  <thead>
      <tr>
          <th>Mode</th>
          <th>What It Reads</th>
          <th>Best For</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>File</strong></td>
          <td>Only the currently open file</td>
          <td>Quick edits on isolated files</td>
      </tr>
      <tr>
          <td><strong>Codebase</strong></td>
          <td>Embeds entire repo (&lt; 50k lines)</td>
          <td>Multi-file features, refactors</td>
      </tr>
      <tr>
          <td><strong>Explicit @file</strong></td>
          <td>Only files you reference with @</td>
          <td>Targeted work on large repos</td>
      </tr>
  </tbody>
</table>
<p><strong>To set context mode:</strong> Open Cascade panel (<code>Cmd+L</code> / <code>Ctrl+L</code>), click the context dropdown at the top.</p>
<p>For projects under 50k lines, switch to Codebase mode. The first time you do this, Windsurf scans and indexes your repo — 30-120 seconds depending on size. After that, index updates are incremental.</p>
<p>On repos over 50k lines or on 8GB RAM machines, use explicit <code>@file</code> references instead: <code>@src/auth/middleware.ts update this to support OAuth2 PKCE flow</code>.</p>
<h2 id="step-5-run-your-first-cascade-flow">Step 5: Run Your First Cascade Flow</h2>
<p>A Cascade Flow is a multi-step agentic task. You describe the outcome; Cascade reads the relevant files, writes a plan, executes it across multiple files, runs tests, fixes failures, and reports back. Open the Cascade panel with <code>Cmd+Shift+L</code> (macOS) or <code>Ctrl+Shift+L</code> (Windows/Linux). The key shift in mindset from Copilot or Cursor is that you stop describing steps and start describing end states. In benchmarks from devtoolsreview.com, Cascade completed a Redis rate-limiting implementation in 3.5 minutes versus 45-60 minutes manually — reading files, writing middleware, adding env vars, applying routes, writing tests, and fixing test failures autonomously. Cascade works correctly on clearly scoped tasks about 75-80% of the time.</p>
<p><strong>Outcome-first prompt example:</strong></p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 616 57"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='200' y='36' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='216' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='224' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='232' y='20' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='232' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='240' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='272' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='280' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='296' y='20' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='304' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='304' y='20' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='312' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='312' y='36' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='328' y='20' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='336' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='336' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='344' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='344' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='352' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='352' y='20' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='360' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='360' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='360' y='36' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='368' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='368' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='368' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='376' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='384' y='20' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='384' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='392' y='4' fill='currentColor' style='font-size:1em'>U</text>
<text text-anchor='middle' x='392' y='20' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='392' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='400' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='400' y='20' fill='currentColor' style='font-size:1em'>9</text>
<text text-anchor='middle' x='400' y='36' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='408' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='408' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='416' y='20' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='416' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='424' y='4' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='424' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='424' y='36' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='432' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='432' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='440' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='440' y='20' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='448' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='456' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='456' y='20' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='464' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='472' y='4' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='472' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='480' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='480' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='488' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='488' y='20' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='496' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='504' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='504' y='20' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='512' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='512' y='20' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='520' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='520' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='528' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='528' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='536' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='536' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='544' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='552' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='552' y='20' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='560' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='560' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='568' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='576' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='584' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='592' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='600' y='20' fill='currentColor' style='font-size:1em'>.</text>
</g>

    </svg>
  
</div>
<p><strong>What to avoid:</strong> Don&rsquo;t write step-by-step instructions like &ldquo;First read middleware.ts, then add a new file&hellip;&rdquo; — Cascade plans steps internally. Describe the end state, not the path.</p>
<p>When Cascade enters a loop (you&rsquo;ll see it running the same commands repeatedly), interrupt with <code>Cmd+K</code> / <code>Ctrl+K</code> and break the task into smaller pieces.</p>
<h2 id="step-6-set-up-memories-and-rules-for-persistent-ai-behavior">Step 6: Set Up Memories and Rules for Persistent AI Behavior</h2>
<p>Windsurf has two persistence mechanisms beyond <code>.windsurfrules</code> that let you encode preferences once and have Cascade apply them automatically forever after. Memories are personal facts Cascade stores about your working style, stored in your Windsurf account and applying across all your projects. Global Rules are project-agnostic preferences that sit above your <code>.windsurfrules</code> in the priority chain. Together with <code>.windsurfrules</code>, these three layers let you encode your entire development philosophy once and stop repeating yourself every session. Understanding the priority order prevents confusion when Cascade seems to ignore something you&rsquo;ve told it: Global Rules override everything, then <code>.windsurfrules</code>, then Memories, then your current prompt.</p>
<p><strong>Memories</strong> — Open Cascade → click the brain icon → &ldquo;Manage Memories.&rdquo; Tell Cascade to remember something inline: <code>@Cascade remember: we never use moment.js, always date-fns</code>.</p>
<p><strong>Global Rules</strong> — Go to <strong>Settings → Windsurf → Cascade → Rules</strong> and add rules like &ldquo;Always use TypeScript strict mode&rdquo; or &ldquo;Prefer functional components in React.&rdquo;</p>
<p>The priority order is: Global Rules → .windsurfrules → Memories → your prompt.</p>
<h2 id="step-7-set-up-workspace-snippets-and-promptsmd">Step 7: Set Up Workspace Snippets and prompts.md</h2>
<p>For prompts you type repeatedly, Windsurf supports a <code>prompts.md</code> shortcut system that saves keystrokes and ensures consistent prompting across your team. Create a <code>prompts.md</code> file at your repo root — each H2 heading becomes a named snippet accessible by typing <code>/</code> in the Cascade panel. This is one of the most underused features in Windsurf: teams that skip it end up with each developer writing their own variation of the same test-generation or code-review prompt, producing inconsistent Cascade outputs. A <code>prompts.md</code> committed to git means every developer uses the same tested, refined prompt templates for common tasks like writing tests, reviewing diffs, or generating documentation. It eliminates prompt quality variance that makes AI output inconsistent across team members, and it compounds over time as your team refines and improves the templates together.</p>
<p>Example <code>prompts.md</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span><span style="color:#75715e">## write-test
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>Write a Jest integration test for the function I have selected.
</span></span><span style="display:flex;"><span>Use supertest for HTTP tests. Mock external APIs with nock.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## review-pr
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>Review this diff for: security issues, missing error handling,
</span></span><span style="display:flex;"><span>N+1 queries, and consistency with our coding conventions.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## explain
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>Explain what this code does, including non-obvious side effects.
</span></span><span style="display:flex;"><span>Assume the reader knows the language but not this codebase.
</span></span></code></pre></div><p>Type <code>/write-test</code> in the Cascade panel to insert the full prompt template.</p>
<h2 id="step-8-connect-mcp-servers-to-extend-cascade">Step 8: Connect MCP Servers to Extend Cascade</h2>
<p>Model Context Protocol (MCP) servers let Cascade access external tools — databases, APIs, GitHub, Slack, file systems. This is one of Windsurf&rsquo;s most powerful but least-configured features among new users. Once connected, an MCP server gives Cascade live context it can&rsquo;t get from reading source code alone. A database MCP server, for example, lets Cascade query your actual schema before writing a migration — eliminating the column-name hallucinations that make AI-generated SQL unreliable. Teams that add a database MCP server on day one report Cascade generating syntactically correct SQL on first attempt over 80% of the time, compared to frequent schema mistakes without it.</p>
<p><strong>To add an MCP server:</strong> Go to <strong>Settings → Windsurf → Cascade → MCP Servers</strong> → click &ldquo;Add Server.&rdquo;</p>
<p>Example: connecting to a local PostgreSQL database:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;postgres&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;command&#34;</span>: <span style="color:#e6db74">&#34;npx&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;args&#34;</span>: [<span style="color:#e6db74">&#34;-y&#34;</span>, <span style="color:#e6db74">&#34;@modelcontextprotocol/server-postgres&#34;</span>, <span style="color:#e6db74">&#34;postgresql://localhost:5432/mydb&#34;</span>]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Common MCP servers to add early:</p>
<ul>
<li><code>@modelcontextprotocol/server-github</code> — PR creation, issue lookup</li>
<li><code>@modelcontextprotocol/server-filesystem</code> — read/write access outside the current project</li>
<li><code>@modelcontextprotocol/server-postgres</code> or <code>server-sqlite</code> — database access</li>
</ul>
<h2 id="step-9-creating-your-first-full-project-with-cascade">Step 9: Creating Your First Full Project With Cascade</h2>
<p>Here&rsquo;s a concrete walkthrough: scaffolding a new Express API from scratch using Windsurf&rsquo;s built-in project generation. This covers the complete first-use experience from blank canvas to a working API with authentication and tests — the kind of greenfield task where Windsurf genuinely outperforms every other AI coding tool available in 2026. The goal isn&rsquo;t just to see Cascade write code; it&rsquo;s to build the habit of outcome-first prompting and understand where to intervene when Cascade needs guidance.</p>
<ol>
<li>Open Windsurf → click &ldquo;Generate a project&rdquo; from the welcome screen (or Command Palette: &ldquo;Windsurf: New AI Project&rdquo;)</li>
<li>Describe the project: <code>Express REST API with TypeScript, PostgreSQL, JWT auth, and Jest tests. Users can create accounts, login, and manage todos.</code></li>
<li>Windsurf generates the initial scaffold, installs dependencies, and opens the project</li>
<li>Immediately create your <code>.windsurfrules</code> file with the stack details</li>
<li>Switch Cascade to Codebase context mode</li>
<li>Add your first feature: <code>Add the todo CRUD endpoints. Include validation with zod. All routes should require JWT authentication. Write tests.</code></li>
</ol>
<p>Cascade will read the existing auth middleware, understand the schema, write route handlers, add zod validation, update the router index, and write tests. Review the diff before accepting — check migration files and security-critical paths carefully.</p>
<h2 id="windsurf-pricing-what-you-get-at-each-tier">Windsurf Pricing: What You Get at Each Tier</h2>
<table>
  <thead>
      <tr>
          <th>Plan</th>
          <th>Price</th>
          <th>Cascade Flow Actions</th>
          <th>Best For</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Free</strong></td>
          <td>$0/month</td>
          <td>25/month</td>
          <td>Evaluation, hobby projects</td>
      </tr>
      <tr>
          <td><strong>Pro</strong></td>
          <td>$15/month</td>
          <td>Unlimited</td>
          <td>Individual developers</td>
      </tr>
      <tr>
          <td><strong>Teams</strong></td>
          <td>$30/user/month</td>
          <td>Unlimited + collab</td>
          <td>Small-to-mid teams</td>
      </tr>
      <tr>
          <td><strong>Enterprise</strong></td>
          <td>Custom</td>
          <td>Unlimited + private models</td>
          <td>SOC2/FedRAMP/HIPAA needs</td>
      </tr>
  </tbody>
</table>
<p>For context: Cursor Pro is $20/month. Windsurf Pro at $15/month is the more affordable option for developers who lean heavily on agentic flows. The free tier&rsquo;s 25 flow actions/month is enough to evaluate the tool but a typical workday of serious development burns 15-30 actions, making the free tier insufficient for daily use. Windsurf reported $82M ARR with 350+ enterprise customers as of July 2025, with 4,000+ enterprises in production and 59% of Fortune 500 companies building with it. Enterprise features include SSO, RBAC, audit logs, SOC 2 Type II compliance, FedRAMP High authorization, HIPAA compliance, and hybrid/on-premise deployment.</p>
<h2 id="troubleshooting-common-setup-issues">Troubleshooting Common Setup Issues</h2>
<p><strong>macOS Gatekeeper blocks Windsurf on launch:</strong>
Go to System Settings → Privacy &amp; Security → scroll down → &ldquo;Open Anyway.&rdquo; One-time step for apps downloaded outside the App Store.</p>
<p><strong>Cascade enters an execution loop:</strong>
Press <code>Cmd+K</code> / <code>Ctrl+K</code> to interrupt. The most common cause is an ambiguous task scope or a missing dependency. Break the task into smaller pieces and be explicit about constraints.</p>
<p><strong>Codebase context mode is slow or crashes:</strong>
Add a <code>.codeiumignore</code> file (same syntax as <code>.gitignore</code>) to exclude <code>node_modules</code>, <code>dist</code>, <code>.git</code>, large binary assets, and generated files. Also exclude directories over 5MB.</p>
<p><strong>Extensions conflict with Windsurf:</strong>
Disable other AI completion extensions (Copilot, Tabnine, Codeium standalone). They compete for the same completion hooks and cause latency spikes or silent failures.</p>
<p><strong>VS Code settings didn&rsquo;t import correctly:</strong>
Open Command Palette → &ldquo;Open User Settings (JSON)&rdquo; and verify <code>~/.config/windsurf/User/settings.json</code>. Most VS Code settings keys work unchanged in Windsurf.</p>
<h2 id="windsurf-vs-cursor-setup-different-philosophies">Windsurf vs Cursor Setup: Different Philosophies</h2>
<p>Windsurf and Cursor are both serious AI coding tools, but their setup process reveals fundamentally different workflow philosophies — and choosing the wrong one for your team&rsquo;s working style is a common source of frustration. Windsurf optimizes for autonomous, outcome-driven work: configure it once with <code>.windsurfrules</code> and context mode, then describe what you want to build. Cursor optimizes for precision: inline suggestions and targeted edits where you maintain tight control over each change. In benchmark tests, Windsurf&rsquo;s Cascade completed a Redis rate-limiting task in 3.5 minutes with zero step-by-step guidance; Cursor would have required more manual steering for the same task. Understanding which philosophy fits your team saves weeks of adapting to the wrong tool.</p>
<table>
  <thead>
      <tr>
          <th>Aspect</th>
          <th>Windsurf</th>
          <th>Cursor</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Core model</strong></td>
          <td>Autonomous agent (Cascade)</td>
          <td>Precision edit assistant</td>
      </tr>
      <tr>
          <td><strong>Setup config</strong></td>
          <td>.windsurfrules + context mode</td>
          <td>.cursorrules + context files</td>
      </tr>
      <tr>
          <td><strong>Autocomplete</strong></td>
          <td>Conservative, high accuracy</td>
          <td>Aggressive, 68-72% immediate usability</td>
      </tr>
      <tr>
          <td><strong>Best for</strong></td>
          <td>Greenfield features, prototyping</td>
          <td>Targeted refactors, surgical edits</td>
      </tr>
      <tr>
          <td><strong>Price</strong></td>
          <td>$15/month Pro</td>
          <td>$20/month Pro</td>
      </tr>
      <tr>
          <td><strong>Weakness</strong></td>
          <td>Loops on multi-constraint tasks</td>
          <td>Codebase-wide agentic tasks</td>
      </tr>
  </tbody>
</table>
<p>Windsurf is better when you frequently build new features and prefer describing outcomes. Cursor is better when you work on mature, large codebases and want precise, predictable suggestions. Many teams use both.</p>
<h2 id="enterprise-teams-sso-fedramp-and-rbac-setup">Enterprise Teams: SSO, FedRAMP, and RBAC Setup</h2>
<p>For teams on the Enterprise plan, setup involves three additional steps beyond the standard installation that enable the compliance and access control features that make Windsurf viable in regulated industries. Windsurf achieved FedRAMP High authorization and HIPAA compliance in 2025, making it one of the few AI coding tools cleared for federal and healthcare environments. The enterprise setup process follows a standard identity provider integration pattern, so if your team already uses Okta, Azure AD, or Google Workspace, SSO configuration takes under 30 minutes. RBAC setup follows after SSO and controls which developers can use which Cascade features.</p>
<p><strong>SSO configuration:</strong> Admin panel → Settings → Authentication → &ldquo;Enable SSO.&rdquo; Supports SAML 2.0 and OIDC. Paste your IdP metadata URL (Okta, Azure AD, Google Workspace all work). Test before rollout.</p>
<p><strong>RBAC setup:</strong> Admin panel → Policies → define roles. Typical setup: developers get full Cascade access, contractors get File context mode only, read-only reviewers can see AI suggestions but not trigger flows.</p>
<p><strong>FedRAMP / HIPAA:</strong> For government or healthcare deployments, contact enterprise sales for hybrid deployment — Cascade inference runs on-premise with your data never leaving your infrastructure.</p>
<p><strong>Audit logs:</strong> Admin panel → Audit Log. Captures every Cascade flow, every file written, every terminal command, and every external API call. Required for SOC 2 Type II reviews.</p>
<h2 id="faq">FAQ</h2>
<p><strong>Can I use Windsurf without a paid subscription?</strong>
Yes. The free tier gives you 25 Cascade flow actions per month, unlimited autocomplete suggestions, and access to base models. For occasional or evaluation use, the free tier works. For daily development, most developers find they need Pro ($15/month) within the first week since a typical workday burns 15-30 flow actions.</p>
<p><strong>How do I import my VS Code extensions into Windsurf?</strong>
During onboarding, select &ldquo;Import from VS Code.&rdquo; Afterward, use the Command Palette and search &ldquo;Install Extensions from VS Code.&rdquo; Extensions requiring VS Code&rsquo;s proprietary APIs or competing AI completion extensions (Copilot, Tabnine) won&rsquo;t work and will be flagged automatically.</p>
<p><strong>What&rsquo;s the difference between Cascade flows and regular chat?</strong>
Regular chat (<code>Cmd+L</code>) gives you a conversational interface for questions and suggestions you apply manually. Cascade flows (<code>Cmd+Shift+L</code>) give Cascade permission to read files, write code, run terminal commands, and execute multi-step plans autonomously. Flows consume from your monthly action quota; chat does not.</p>
<p><strong>How does .windsurfrules differ from Memories?</strong>
<code>.windsurfrules</code> is project-specific, checked into git, and applies to everyone on the team. Memories are personal, stored in your Windsurf account, and apply across all your projects. Use <code>.windsurfrules</code> for team conventions and stack definitions. Use Memories for personal preferences like &ldquo;always add JSDoc to public functions.&rdquo;</p>
<p><strong>Is Windsurf safe for codebases with proprietary or sensitive code?</strong>
Windsurf offers enterprise options with SOC 2 Type II, FedRAMP High, and HIPAA compliance, plus hybrid/on-premise deployment where Cascade inference runs within your infrastructure. For standard cloud plans, code is sent to Codeium&rsquo;s servers for AI inference. Review Windsurf&rsquo;s data processing agreement before using it on codebases with contractual data residency requirements.</p>
]]></content:encoded></item></channel></rss>