# What changed in ultracite

> 75 changes in ultracite 7 to 8 from its official release notes, upgrade guides and advisories: 25 breaking, 1 deprecations, 1 security, 13 new APIs and options. Each one cited. Sources checked 2026-10-19. HTML: https://unstale.sh/npm/ultracite/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## ultracite 8

### Breaking changes

- The Oxlint and ESLint React presets enable form checking with `forms: true`, matching Biome's behavior. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- The Oxlint js-plugins preset now enables 32 SonarJS rules that run without type information, including security rules. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- init now writes Ultracite's rules to AGENTS.md for every agent; it adds agent-specific imports or settings only where needed. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Astro preset now applies ESLint core rules to component frontmatter, including TypeScript rules, with type-checked rules off. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- When no browser targets are configured, Ultracite checks against Baseline Widely available browsers; explicit project targets or BROWSERSLIST remain in effect. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The ESLint core preset now treats unsupported browser APIs as errors instead of warnings. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- An editor extension install taking longer than two minutes is stopped and treated as failed, prompting manual installation. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- init now configures Zed to use Prettier as formatter while retaining ESLint fixes as code actions. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Init writes Devin's Claude Code-format PostToolUse hook to .devin/hooks.v1.json and removes old generated hooks while preserving user hooks. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Ultracite now requires Node.js 22.18 or later, or Bun. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Biome core preset now treats this rule as an error instead of a warning. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Biome core preset now enables noForIn as an error, reporting every for...in loop, including guarded ones. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Biome core preset now treats this rule as an error instead of a warning, so ultracite check fails when it is reported. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Biome core preset enables this rule as an error; undeclared imports are reported, including workspace dependencies declared only in the root package.json. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Biome core preset now treats this rule as an error instead of a warning. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Ultracite now requires oxfmt >=0.71.0 and <1.0.0; init and upgrade install it within a caret range of the preset-checked version. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The ESLint core and Stylelint presets no longer run Prettier as a lint rule; standalone ESLint and Stylelint runs therefore report lint problems only. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- --quiet now suppresses banners, spinners, and progress output without skipping prompts; use it with --yes to run without prompts. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Zed settings no longer request this unsupported Oxc code action on save; Oxfmt sorts imports when formatting. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Cypress lint rules are now provided by an opt-in ESLint preset rather than the core preset. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Storybook lint rules are now provided by an opt-in ESLint preset rather than the core preset. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- For supported agent hooks, unfixable lint and formatting problems are returned to the agent; Devin receives them through hook context instead of exit code 2. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- A patch that only deletes files now makes the hook do nothing instead of triggering a whole-project fix. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- ultracite upgrade accepts --version to install a specified release; Ultracite's own -v and --version now work only before a command. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Vue preset now applies ESLint core rules, including TypeScript rules, to component scripts; type-checked rules remain off there. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)

### Security

- The rules file written by `init` now tells agents to use `rel="noopener noreferrer"` on `target="_blank"` links. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)

### Deprecations

- The retired Roo Code agent ID is still accepted but now writes rules to AGENTS.md with a warning; the skill installer no longer targets .roo. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)

### New APIs and options

- The anti-slop preset enables a rule rejecting adjacent eager `filter`/`map` passes over arrays. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- The anti-slop preset enables a rule rejecting reducers that copy their accumulator on every iteration. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- The anti-slop preset enables a rule that restores blank lines around structural boundaries; its autofix only inserts whitespace. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- antigravity is now an agent identifier accepted by init --agents and reads AGENTS.md. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- fx is now an agent identifier accepted by init --agents and reads AGENTS.md. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- init --hooks grok writes a post-edit hook here; Grok Build runs it after Write or Edit when project hooks are trusted. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Generates a Codex PostToolUse hook that runs ultracite fix --hook after apply_patch edits. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Generates a Deep Agents PostToolUse hook that runs ultracite fix --hook after Write or Edit. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- An empty Biome preset makes Cypress selectable with Biome even though Biome has no Cypress rules. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- An empty Biome preset makes Storybook selectable with Biome even though Biome has no Storybook rules. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Type-checked ESLint rules moved into an opt-in preset; core no longer builds a TypeScript program and can lint TypeScript without a tsconfig. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Vitest's type-checked ESLint rules are now available as an add-on preset to use after the Vitest preset. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- init gains --yes (-y) to accept defaults without prompting; it does this automatically in CI or without an interactive terminal. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)

### Behavior and default changes

- The ESLint core preset no longer configures a `node` resolver; its TypeScript resolver also resolves JavaScript files. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- `init` now writes `env: core.env`; generated workspace configs repeat `env: root.env`, and migrated `.oxlintrc.json` files keep their `env` alongside the core preset. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- Init installs the Ultracite skill in AdaL's own skill folder when AdaL is selected or its folder already exists. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- init merges `read: AGENTS.md` and a lint command into Aider's configuration, so Aider loads the rules and lints each edited file. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Init installs the Ultracite skill in IBM Bob's own skill folder when selected or when its folder already exists. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- On upgrade, --claude hands applicable configuration changes to the agent CLI and checks the project afterward; it requires release 8 or later. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- init asks before changing files it does not own and asks all questions before writing; it preserves legacy ESLint config files when the project uses ESLint. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Aider runs the configured Ultracite fix command on each file it edits and asks the model to fix remaining problems; an existing lint-cmd is left alone. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- ESLint check and fix suppress warnings for named files without matching configuration by default; callers can override this with --warn-ignored or --no-warn-ignored. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- init --type-aware now sets Oxlint's typeAware option so check, fix, and the editor extension run type-aware rules. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Pre-commit hooks configured by init now pass staged files to ultracite fix rather than fixing the whole project; supported file globs have also expanded. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Svelte preset now applies ESLint core rules to component scripts and disables rules that misread Svelte scope or are replaced by Svelte-specific rules. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Zed's Oxlint settings now set typeAware to null so the language server follows options.typeAware in the Oxlint config instead of enabling type-aware linting unconditionally. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Installs the linter editor extension using the selected editor's own launcher instead of always invoking code. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Unknown, retired, or misspelled agent IDs now receive AGENTS.md with a warning instead of stopping initialization; renamed IDs map to their replacements. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- The Biome type-aware preset no longer enables this rule, so type-aware linting no longer requires extensions on every relative import. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)

### Tooling

- The rules file written by `init` again tells agents to avoid import cycles, which the Oxlint and ESLint core presets report. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- The preset enables three new rules, including whitespace-only autofix behavior that may produce a one-time whitespace diff after upgrading. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- Devin Desktop replaces Windsurf as the editor and hook ID; init still accepts windsurf with a note to switch. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Init writes a .gitignore containing node_modules when there is no repository and no local ignore file. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- With Oxlint, init points users to the Oxc extension and removes the unsupported organize-imports-on-save action because Oxfmt sorts imports. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Kiro CLI replaces Amazon Q CLI as the agent ID; the old ID remains accepted with a note to switch, and rules go in AGENTS.md. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Init writes an ESLint-compatible config that passes ultracite check and replaces the old one-line config on rerun, while preserving user-modified files. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- init enables strictNullChecks only when type-aware linting is on and, interactively, asks before changing TypeScript configuration files. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Init writes the legacy workspace TypeScript setting for Antigravity IDE, CodeBuddy, Trae, and Void so those editors use the project's TypeScript version. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- upgrade now updates project configuration as well as packages, applying applicable major-version migration guides and checking whether required changes remain. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)

### Fixes and other changes

- The --claude and --codex runs provide agents with configured rule names and diagnostic help, process files in path order, re-lint before handing over each file, and count deleted or unparsable files as unfixed. (8.0.1) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.1)
- Under Devin, ultracite fix --hook exits successfully and provides unresolved problems as additional hook context rather than using Devin's exit-code-2 block behavior. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- With ESLint, init installs the Angular ESLint plugin version tested against the Angular preset instead of the latest release. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- For npm projects, init and upgrade add package.json overrides pointing selected ESLint plugins' eslint peers at the project's ESLint, allowing later installs to succeed. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Init installs the Ultracite skill in Qoder's own skill folder when selected or when its folder already exists. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- Agent hooks invoke the installed Ultracite directly rather than the project's fix script, preserving projects whose script runs another tool. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)
- When init creates biome.jsonc without a local ignore file, it sets vcs.root to the repository root so Biome can find version-control ignores. (8.0.0) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%408.0.0)

## ultracite 7

### Tooling

- Adds an opt-in ESLint preset for gdp-ts that makes authorization checks visible to the type checker and applies upstream strict-mode rules. (7.12.4) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%407.12.4)
- Adds an opt-in Oxlint preset for gdp-ts that makes authorization checks visible to the type checker and applies upstream strict-mode rules. (7.12.4) — [release notes](https://github.com/haydenbleasel/ultracite/releases/tag/ultracite%407.12.4)
