Convert Cursor rules to Windsurf (Devin Desktop) rules
Windsurf's documentation now lives under Devin Desktop. Workspace rules are Markdown files in .devin/rules/, and the older .windsurf/rules/ and .windsurfrules files are described as legacy but still imported by default.
This is the friendliest direction to convert: Windsurf's trigger field has a value for each of Cursor's four rule types, so every rule keeps its behaviour.
Input
Everything runs in your browser. Files are never uploaded.
Output
Converted files appear here. Conversion report
How each rule type converts
| In Cursor rules (.mdc) | Becomes | Result |
|---|---|---|
alwaysApply: true | trigger: always_on | Kept |
globs | trigger: glob + globs | Kept |
description only | trigger: model_decision + description | Kept |
| Manual rules | trigger: manual | Kept |
Steps
- Drop your
.cursor/rulesfiles or.cursorrulesinto the converter. - Rules are written to
.devin/rules/. Tick Use legacy .windsurf/rules/ if your editor version still expects the old path. - Download, unpack at the repository root and reopen the workspace.
Worked example
This output is generated by the same converter you use above, from an illustrative rule set.
Input
.cursor/rules/project.mdc
---
description:
globs:
alwaysApply: true
---
# Project
- Next.js App Router with TypeScript in strict mode.
- Use pnpm. Run `pnpm test` and `pnpm lint` before committing.
- Never commit secrets; read config from environment variables. .cursor/rules/react-components.mdc
---
description: React component conventions
globs: src/components/**/*.tsx
alwaysApply: false
---
- Function components only; no default exports.
- Co-locate tests as `Component.test.tsx`. .cursor/rules/database.mdc
---
description: Read before writing or changing database migrations
globs:
alwaysApply: false
---
- Never edit a migration that has already been applied.
- Every new table needs a primary key and created_at. .cursor/rules/release.mdc
---
description:
globs:
alwaysApply: false
---
- Bump the version in package.json and update CHANGELOG.md. Output
.devin/rules/project.md
---
trigger: always_on
---
# Project
- Next.js App Router with TypeScript in strict mode.
- Use pnpm. Run `pnpm test` and `pnpm lint` before committing.
- Never commit secrets; read config from environment variables. .devin/rules/react-components.md
---
trigger: glob
globs: "src/components/**/*.tsx"
---
- Function components only; no default exports.
- Co-locate tests as `Component.test.tsx`. .devin/rules/database.md
---
trigger: model_decision
description: Read before writing or changing database migrations
---
- Never edit a migration that has already been applied.
- Every new table needs a primary key and created_at. .devin/rules/release.md
---
trigger: manual
---
- Bump the version in package.json and update CHANGELOG.md. Report for this example
- kept Project: Written to .devin/rules/project.md with trigger `always_on`.
- kept React Components: Written to .devin/rules/react-components.md with trigger `glob` (globs: `src/components/**/*.tsx`).
- kept Database: Written to .devin/rules/database.md with trigger `model_decision`.
- kept Release: Written to .devin/rules/release.md with trigger `manual`.
Things to watch for
- The docs show a single pattern in
globs. When a Cursor rule has several, they are joined with commas and the report asks you to check that each one matches. - Devin Desktop also reads
AGENTS.mdas an always-on rule. Avoid keeping the same instructions in both places. - Cursor's legacy
.cursorrulesbecomes one always-on rule; enable splitting to get one file per##section.
FAQ
Does Windsurf import Cursor rules automatically?
Its documentation describes importing its own legacy files (.windsurfrules, .windsurf/rules) but not Cursor's .mdc files, so convert them.
Is Windsurf now called Devin Desktop?
The Windsurf docs URL redirects to Devin Desktop documentation, which still refers to .windsurf paths as legacy and to Windsurf Plugins for other editors.