Skip to content
Ultracite
Esc
↑↓navigate↵open⌘Jpreview

Windsurf’s editor, with Devin Local as its agent

ultracite init --editors devin writes .vscode/settings.json, so Devin Desktop formats on save and applies your linter’s safe fixes, and installs the extension from its Open VSX mirror with the devin-desktop launcher. Since 3.9.19 its only agent is Devin Local, which loads AGENTS.md, and --hooks devin hands it what ultracite fix couldn’t fix after each edit.

Devin Desktop by CognitionChecked against Devin Desktop 3.10.48

{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnPaste": true,
  "editor.formatOnSave": true,Format on save
  "emmet.showExpandedAbbreviation": "never",
  "js/ts.tsdk.path": "node_modules/typescript/lib",The project’s TypeScript
  "js/ts.tsdk.promptToUseWorkspaceVersion": true,
  "[astro]": {
    "editor.defaultFormatter": "astro-build.astro-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[graphql]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[handlebars]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[html]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[javascriptreact]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[less]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[markdown]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[scss]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[typescript]": {Oxfmt formats it
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[vue-html]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[vue]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "[yaml]": {
    "editor.defaultFormatter": "oxc.oxc-vscode"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll.oxc": "explicit"Oxlint’s safe fixes
  }
}
Oxlint + Oxfmt
What init does in Devin Desktop
  1. 1Writes .vscode/settings.jsonA new file, or merged into yours setting by setting, with your comments and other settings kept.
  2. 2Installs oxc.oxc-vscodeWith devin-desktop --install-extension, or windsurf on older installs, when it creates the settings file.
  3. 3With --hooks devin, writes .devin/hooks.v1.jsonRuns npx ultracite fix --hook on each file Devin Desktop’s agent edits.
Then, in Devin Desktop
  1. 4Trust the workspace when Devin Desktop asks. Until you do, Devin Local and hooks stay off.
  2. 5If init couldn’t run devin-desktop or windsurf, install the Oxc extension from the Extensions view, or Biome’s if you picked Biome.
  3. 6Save a file: Oxfmt formats it and Oxlint’s safe fixes apply.

Three toolchains, one settings.json

init writes the settings for the toolchain you pick, so Devin Desktop formats with the same tool as ultracite fix and applies its fixes when you save.

  • Oxlint + OxfmtDefault

    Extension
    oxc.oxc-vscode
    Formats with
    oxc.oxc-vscode
    On save
    source.fixAll.oxc

    --linter oxlint

  • Biome

    Extension
    biomejs.biome
    Formats with
    biomejs.biome
    On save
    source.fixAll.biomesource.organizeImports.biome

    --linter biome

  • ESLint + Prettier + Stylelint

    Extensions
    dbaeumer.vscode-eslintesbenp.prettier-vscode
    Formats with
    esbenp.prettier-vscode
    On save
    source.fixAll.eslintsource.organizeImports

    --linter eslint

The Windsurf editor under a new name

Devin Desktop is Windsurf renamed, still built on Code OSS: it reads .vscode/settings.json, installs extensions from an Open VSX mirror, and keeps agents and hooks off until you trust the workspace.

Renamed
Windsurf became Devin Desktop on June 2, 2026. Settings carry over automatically, and the first-run Migrate from Windsurf option copies your extensions.
Extensions
From an Open VSX mirror at marketplace.windsurf.com. oxc.oxc-vscode, biomejs.biome, dbaeumer.vscode-eslint and esbenp.prettier-vscode are all on it.
Launcher
devin-desktop, from Shell Command: Install 'devin-desktop' command in PATH. It takes --install-extension, and the old windsurf and surf commands still ship in ~/.codeium/windsurf/bin/.
Restricted Mode
In an untrusted workspace, Devin Local and every other agent are off, and hooks neither load nor run. Trusting the workspace turns them back on.
Project folder
Rules, skills, workflows and hooks moved from .windsurf/ to .devin/. Devin Desktop still reads .windsurf/ as a fallback.
Agent edits
Shown as diff zones with accept and reject controls for each hunk. Turn them off under Editor → User interface → Agent diff zones to have edits applied straight to the file.

Devin Local took over from Cascade

Devin Local runs the same architecture as Devin CLI: it loads AGENTS.md as an always-on rule and is fed the lint errors detected after its edits. --hooks devin adds a PostToolUse hook to .devin/hooks.v1.json, which runs ultracite fix --hook on each file it writes or edits and adds what’s left to its context.

Where the agent looks for instructions
  1. 1~/.config/devin/AGENTS.mdYour global rules, loaded in every project alongside the project’s own.
  2. 2AGENTS.mdUltraciteAt the workspace root, loaded at session start as an always-on rule. This is where init writes Ultracite’s rules.
  3. 3CLAUDE.md, AGENT.md, .windsurfrulesTreated the same as AGENTS.md: their contents load as always-on rules.
  4. 4.devin/rules/*.md, .windsurf/rules/*.mdOne rule per file, applied by its trigger frontmatter. Both folders load, and .cursor/rules/*.mdc is read too.
  5. 5packages/*/AGENTS.mdRead when the agent opens files in that directory, so only the relevant rules load.
{
  "PostToolUse": [
    {
      "hooks": [
        {
          "command": "npx ultracite fix --hook",
          "type": "command"
        }
      ],
      "matcher": "^(write|edit|apply_patch)$"
    }
  ]
}
init --hooks devin
  1. 01Devin Local writes or edits a file, and the change shows as a diff zone you can accept or reject.
  2. 02With --hooks devin, ultracite fix --hook fixes and formats that file, and hands what it couldn’t fix back as additionalContext.
  3. 03The Oxc, Biome or ESLint extension lints the file too, and lint errors detected after the edit go back to the agent, with a cap so it doesn’t loop on one it can’t resolve.
  4. 04It fixes what’s left in its next step, or runs npx ultracite check as AGENTS.md says once you approve the command.
Agent pageUltracite for Devin

Worth knowing about Devin Desktop

  • Cascade’s setup doesn’t carry over

    Cascade was removed in 3.9.19, on September 8, 2026. The Devin: Open Cascade Migration Wizard command moves its hooks, workflows and memories across, and a separate command migrates Windsurf hooks into Devin hooks in every workspace folder.

  • The Ultracite skill loads as is

    Devin Local loads project skills from .agents/skills/, .devin/skills/ and .windsurf/skills/. init installs the Ultracite skill into .agents/skills/, so /ultracite runs it, and the agent can invoke it on its own.

  • Worktrees need their own install

    Devin Local can work in a git worktree, a separate checkout with no node_modules. A post_setup_worktree hook in .devin/hooks.json runs inside each new worktree, Devin Local’s included, so you can install dependencies there before the agent lints.

Devin Desktop questions, answered

Is Windsurf now Devin Desktop?
Yes. Cognition renamed Windsurf to Devin Desktop on June 2, 2026, as a regular over-the-air update. npx ultracite init --editors devin sets it up, and the old --editors windsurf id still works.
Does Devin Desktop still have Cascade?
No. Cascade was removed in 3.9.19, and Devin Local is the only agent in Devin Desktop. A Continue in Devin Local prompt moves existing Cascade conversations to it.
Does --hooks devin work with Devin Local?
Yes. It writes a PostToolUse hook to .devin/hooks.v1.json, in Claude Code’s format, which Devin Local and Devin CLI read. Re-running init takes the post_write_code hook earlier versions wrote for Cascade out of .devin/hooks.json and .windsurf/hooks.json, and leaves your own hooks there.
Does Devin Desktop read AGENTS.md?
Yes. Devin Local loads AGENTS.md at the workspace root as an always-on rule at session start, and picks up AGENTS.md files in subdirectories when it works on files there. It reads CLAUDE.md, .windsurfrules and .devin/rules too.
Why didn’t the Biome extension install in Devin Desktop?
init installs it only when it creates .vscode/settings.json, and only if devin-desktop or the older windsurf command is on your PATH. Run Shell Command: Install 'devin-desktop' command in PATH, or install the extension from the Extensions view.
Does Devin Local fix lint errors on its own?
Yes. Lint errors detected after Devin Local’s edits are fed back to it to fix, with new errors marked apart from ones it has already seen and a cap so it doesn’t loop on one it can’t resolve.

Ship less slop

One command sets up your linter, formatter, editor and agents. Works with Oxlint, Biome and ESLint.