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

Zed, with your linter as a language server

ultracite init --editors zed writes .zed/settings.json, so Zed formats on save and applies safe fixes through your toolchain’s language server: Oxc’s, Biome’s, or ESLint’s with Prettier. Zed Agent reads AGENTS.md and can check its own edits against the same language servers.

Zed by Zed IndustriesChecked against Zed 1.23.2

{
  "format_on_save": "on",Format on save
  "formatter": "language_server",
  "lsp": {
    "vtsls": {
      "settings": {
        "javascript": {
          "preferences": {
            "includePackageJsonAutoImports": "on"
          }
        },
        "typescript": {
          "preferences": {
            "includePackageJsonAutoImports": "on"
          }
        }
      }
    },
    "oxfmt": {
      "initialization_options": {
        "settings": {
          "configPath": null,
          "flags": {},
          "fmt.configPath": null,
          "fmt.experimental": true,
          "run": "onSave",
          "typeAware": false,
          "unusedDisableDirectives": false
        }
      }
    },
    "oxlint": {
      "initialization_options": {
        "settings": {
          "disableNestedConfig": false,
          "fixKind": "safe_fix",
          "run": "onType",
          "typeAware": null,
          "unusedDisableDirectives": "deny"
        }
      }
    }
  },
  "languages": {
    "JavaScript": {
      "code_actions_on_format": {
        "source.fixAll.oxc": trueOxlint’s safe fixes
      },
      "formatter": {
        "language_server": {
          "name": "oxfmt"Oxfmt formats it
        }
      }
    },
    "TSX": {
      "code_actions_on_format": {
        "source.fixAll.oxc": true
      },
      "formatter": {
        "language_server": {
          "name": "oxfmt"
        }
      }
    },
    "TypeScript": {
      "code_actions_on_format": {
        "source.fixAll.oxc": true
      },
      "formatter": {
        "language_server": {
          "name": "oxfmt"
        }
      }
    }
  }
}
Oxlint + Oxfmt
What init does in Zed
  1. 1Writes .zed/settings.jsonA new file, or merged into yours setting by setting, with your comments and other settings kept.
  2. 2Points you to the Oxc or Biome extensionZed extensions install from its own extensions view, so init links the one your toolchain needs. ESLint and Prettier are built into Zed.
Then, in Zed
  1. 3Trust the project from the warning icon in the title bar. Until you do, Zed skips .zed/settings.json.
  2. 4Install the Oxc extension from zed: extensions, or Biome’s if you picked Biome.
  3. 5Save 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 Zed formats with the same tool as ultracite fix and applies its fixes when you save.

  • Oxlint + OxfmtDefault

    Needs
    Oxc extension
    Formats with
    oxfmt language server
    On save
    source.fixAll.oxc

    --linter oxlint

  • Biome

    Needs
    Biome extension
    Formats with
    biome language server
    On save
    source.fixAll.biomesource.organizeImports.biome

    --linter biome

  • ESLint + Prettier + Stylelint

    Needs
    Built in
    Formats with
    Prettier
    On save
    source.fixAll.eslintsource.organizeImports.eslint

    --linter eslint

Before Zed applies the settings

Zed runs your toolchain through language servers, which come from Zed extensions or ship with Zed, and it only applies .zed/settings.json in a project you trust.

Restricted Mode
Zed opens every new folder in Restricted Mode, which skips .zed/settings.json and starts no language servers. Trust the project from the warning icon in the title bar.
Oxlint and Oxfmt
Run through the Oxc extension (oxc-project/oxc-zed), which needs Zed 0.205 or later and Oxlint 1.35 or later. init points you to it; install it from zed: extensions.
Biome
Runs through the Biome extension (biomejs/biome-zed). init points you to it when you pick Biome.
ESLint and Prettier
Built into Zed. Its Prettier integration uses your project’s own Prettier install, config and plugins, as ultracite fix does.
TypeScript server
Zed uses vtsls for TypeScript and JavaScript, so Ultracite sets its import preferences under lsp.vtsls.settings.
Extension prompts
Zed suggests extensions for the files you open (suggest_extensions, on by default), and auto_install_extensions installs the ones you list.

Zed Agent sees the lint errors you see

Zed Agent loads AGENTS.md as project instructions, and its diagnostics tool reads the errors and warnings your language servers report. So after an edit it can check the same Oxlint, Biome or ESLint results you see in the editor. External agents such as Claude and Codex run as their own processes over the Agent Client Protocol and read their own config.

Where the agent looks for instructions
  1. 1~/.config/zed/AGENTS.mdPersonal instructions for every project. Project instructions win when the two conflict.
  2. 2.rules, .cursorrules, .windsurfrules, .clinerulesChecked first. Zed uses only the first project file it finds, so any of these hides AGENTS.md.
  3. 3.github/copilot-instructions.md, AGENT.mdAlso ahead of AGENTS.md in Zed’s list.
  4. 4AGENTS.mdUltraciteWhere init writes Ultracite’s rules. Loaded as project instructions when no file above it exists.
  5. 5CLAUDE.md, GEMINI.mdRead only when none of the files above exist.
  1. 01Zed Agent edits a file in your project.
  2. 02The Oxc, Biome or ESLint language server lints the changed buffer, as it does for your own edits.
  3. 03The agent can call diagnostics on that file to see what the linter reported, then fix it before moving on.

Worth knowing about Zed

  • Not a VS Code fork

    Zed doesn’t run VS Code extensions, so it gets its own settings file. Oxlint, Oxfmt and Biome come from Zed extensions, and ESLint and Prettier ship with Zed, so the ESLint toolchain needs nothing installed.

  • The Ultracite skill loads as is

    Zed Agent loads skills from the project’s .agents/skills/ folder, where init installs the Ultracite skill, and from ~/.agents/skills/. Editing a SKILL.md takes effect without restarting the session.

  • External agents keep their own setup

    Claude, Codex, Gemini CLI and other agents run in Zed’s Agent Panel over the Agent Client Protocol, as separate processes. They read their own instruction files and settings rather than Zed’s, so set them up with init --agents as you would in a terminal.

Zed questions, answered

Does Ultracite work with Zed?
Yes. npx ultracite init --editors zed writes .zed/settings.json for Oxlint and Oxfmt, Biome, or ESLint and Prettier. Install the Oxc or Biome extension from Zed’s extensions view; ESLint and Prettier are built in.
Why doesn’t Zed format on save after init?
Zed ignores .zed/settings.json and starts no language servers until you trust the project, and Oxlint and Biome need their Zed extension. Trust the folder from the warning icon in the title bar, then check the extension is installed.
Does Zed Agent read AGENTS.md?
Yes, as project instructions, but only when no file ahead of it in Zed’s list exists: .rules, .cursorrules, .windsurfrules, .clinerules, .github/copilot-instructions.md or AGENT.md. Zed uses the first one it finds.
Can I use ESLint and Prettier in Zed?
Yes. init --linter eslint --editors zed keeps ESLint’s fixes and import sorting as code actions and makes Prettier the formatter. Zed’s Prettier integration uses your project’s own Prettier install, config and plugins.
Does Ultracite install the Zed extension for me?
No. Zed extensions install from its extensions view (zed: extensions), and Ultracite doesn’t install any. Zed suggests extensions for the files you open, and its auto_install_extensions setting installs the ones you name.

Ship less slop

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