---
title: Migrate from ESLint
description: Migrate an ESLint-based project to Ultracite while keeping plugin-driven workflows, formatter alignment, and project-specific overrides.
---

If you're already using ESLint and want to switch to Ultracite's preconfigured setup, this guide will help you migrate while preserving your code quality standards.

## Why Migrate to Ultracite?

- **Multiple Providers**: Choose between Biome, ESLint + Prettier + Stylelint, or Oxlint
- **Zero Configuration**: Ultracite provides highly configured presets for each provider
- **Editor Integration**: Built-in support for AI-powered editors (Cursor, Windsurf, GitHub Copilot)
- **Consistent Workflow**: Standardized setup across projects and teams
- **Maintained Rules**: Regular updates with new best practices

## Before You Start

Make sure you have:

- An existing project using ESLint
- Node.js 20.19+ (or 22.13+ on Node 22)
- An ESLint configuration file (e.g., `.eslintrc`, `eslint.config.js`)

## Migration Options

### Option 1: Quick Migration (Recommended)

The fastest way is to run the [automatic setup script](/docs/setup#installation).

```package-install
npx ultracite init
```

This will:

- Prompt you to choose a linting provider (Oxlint, Biome, or ESLint), with ESLint preselected if init finds your flat config
- Install Ultracite and the necessary dependencies
- Create your linter configuration from Ultracite's presets (see below for what happens to your existing config)
- Add `check` and `fix` scripts to `package.json` (an existing `check` or `fix` script that doesn't run Ultracite is kept, with a warning)
- Update your `.vscode/settings.json` in place, keeping your settings and comments (if you set up a VS Code-based editor)
- Enable `strictNullChecks` in your `tsconfig.json` files, unless it's already on (directly or through `extends`) or explicitly set to `false`, which init leaves alone with a warning
- Set up editor integrations

If you switch to Biome or Oxlint, Ultracite automatically removes the existing ESLint setup. This will:

- Remove the ESLint, Prettier, and Stylelint packages Ultracite installs from `devDependencies` (anything in `dependencies` or `peerDependencies`, and plugins Ultracite doesn't install, are left alone)
- Remove any ESLint, Prettier, and Stylelint configuration files (including legacy `.eslintrc*` files) and the `"prettier"` and `"stylelint"` keys in `package.json`

Your `.vscode/settings.json` is merged rather than replaced, so settings for your previous tools (such as a default formatter) may remain; remove any that conflict with the new toolchain.

If you choose ESLint as your provider, Ultracite writes a flat config that uses its presets: your ES module config is updated in place, while a CommonJS config is replaced by `eslint.config.mjs`, and legacy `.eslintrc*` files are removed. An existing config that doesn't use Ultracite's presets yet is replaced, and a warning names the file, so copy back any custom rules or plugins you want to keep (after the Ultracite presets). Once your config spreads an `ultracite/eslint/*` preset, re-running init keeps your additions: other presets, your own config objects, and a `defineConfig` wrapper. A config init can't parse is left unchanged with a warning. Prettier and Stylelint configs are handled similarly (see the [Prettier](/docs/migrate/prettier) and [Stylelint](/docs/migrate/stylelint) guides).

### Option 2: Manual Migration

If you prefer more control over the process, follow the [Setup](/docs/setup#installation) steps and manually remove ESLint and its configuration files.

After the migration, restart your editor to ensure the new configuration is applied.
