Skip to main content

Oxlint vs ESLint: Rust-Powered Linting Performance 2026

·PkgPulse Team

Oxlint is 50-100x faster than ESLint. On a 264,000-file codebase, Oxlint processes ~10,000 files per second. Mercedes-Benz saw a 71% decrease in lint time after switching. Shopify uses Oxlint in production. Yet ESLint still has 68 million weekly npm downloads to Oxlint's 638K. The performance advantage is real — the ecosystem gap is also real.

TL;DR

Oxlint is the fastest JavaScript linter available in 2026, and it's ready for production use. The smart migration path is running Oxlint alongside ESLint — Oxlint handles the fast foundational rules, ESLint handles plugins Oxlint can't replace. Full migration makes sense for new projects or projects without ESLint plugin dependencies.

Key Takeaways

  • Oxlint: 50-100x faster than ESLint per official benchmarks
  • ESLint: 68M weekly downloads; Oxlint: 638K weekly downloads (growing fast)
  • Oxlint v1.0 went stable in August 2025 (backed by VoidZero, the team behind Vite/Rolldown)
  • Oxlint has 695 built-in rules; ESLint's ecosystem has tens of thousands via plugins
  • eslint-plugin-oxlint lets you disable ESLint rules covered by Oxlint (run both tools)
  • Companies using Oxlint in production: Shopify, Mercedes-Benz, Airbnb, Zalando

What Is Oxlint?

Oxlint is a JavaScript/TypeScript linter written in Rust, part of the OXC (Oxidation Compiler) project. OXC is building a complete JavaScript toolchain in Rust — Oxlint is the first production-ready piece.

npm install -D oxlint
# or
npx oxlint . --deny-warnings

Unlike ESLint, Oxlint is a single binary. No configuration required to start getting value.

Speed Comparison

Raw Benchmarks (264,925 files)

ToolTimeFiles/sec
Oxlint22.5s11,774
ESLint (no type-checking)~35 min~125
Biome~45s~5,887

Oxlint benchmarks show it processing files approximately 62x faster than ESLint in real-world testing.

Why So Fast?

  1. Rust: No JavaScript VM overhead, no garbage collection pauses
  2. Parallelism: Uses all CPU cores by default (ESLint is single-threaded)
  3. Architecture: Unified parser with minimal allocations, no plugin overhead
  4. No plugin system (yet): Plugin loading and initialization adds significant overhead to ESLint

Installation and Basic Usage

npm install -D oxlint

# Lint current directory
npx oxlint .

# Lint with all recommended rules
npx oxlint . --rules-of-hooks

# Fix auto-fixable issues
npx oxlint . --fix

# JSON output
npx oxlint . --format json

Configuration (oxlint.json)

{
  "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/crates/oxc_linter/schemas/oxlintrc.schema.json",
  "plugins": ["react", "unicorn", "import"],
  "env": {
    "browser": true,
    "node": true
  },
  "rules": {
    "no-unused-vars": "error",
    "no-console": "warn",
    "prefer-const": "error",
    "eqeqeq": ["error", "always"],
    "react/rules-of-hooks": "error",
    "react/jsx-no-target-blank": "error"
  },
  "overrides": [
    {
      "files": ["*.test.ts"],
      "rules": {
        "no-console": "off"
      }
    }
  ]
}

Rule Coverage (695 Rules)

Oxlint v1.x includes rules in these categories:

CategoryCountExamples
Correctness200+no-unused-vars, no-undef, array-type
Suspicious100+no-debugger, no-eval, typeof-comparison
Style150+prefer-const, no-var, arrow-function
React80+rules-of-hooks, jsx-no-target-blank
TypeScript100+no-explicit-any, consistent-type-imports
Unicorn50+filename-case, no-process-exit
Import50+no-duplicates, no-cycle

React Plugin

{
  "plugins": ["react"],
  "rules": {
    "react/rules-of-hooks": "error",
    "react/exhaustive-deps": "warn",
    "react/jsx-no-target-blank": "error",
    "react/no-direct-mutation-state": "error"
  }
}

Oxlint's React plugin covers the most important eslint-plugin-react-hooks rules.

The most pragmatic 2026 approach is running Oxlint for fast foundational checks and ESLint for plugin-specific rules you can't yet replace:

npm install -D oxlint eslint-plugin-oxlint
// eslint.config.js — disable rules Oxlint already covers
import oxlint from 'eslint-plugin-oxlint';

export default [
  // Your ESLint config for plugin-specific rules...
  js.configs.recommended,
  ...ts.configs.recommended,
  {
    plugins: { react, 'react-hooks': reactHooks },
    rules: {
      // Accessibility rules Oxlint doesn't have
      'jsx-a11y/alt-text': 'error',
      'jsx-a11y/anchor-is-valid': 'error',
    },
  },
  // Disable ESLint rules that Oxlint handles (avoid duplication)
  oxlint.configs['flat/recommended'],
];
// package.json scripts
{
  "scripts": {
    "lint": "oxlint . && eslint .",
    "lint:fast": "oxlint ."
  }
}

With this setup:

  • lint:fast: Oxlint only (use in pre-commit, CI fast path)
  • lint: Full lint with both tools (use for thorough checks)

The ESLint run is now much faster because eslint-plugin-oxlint disables rules Oxlint already handles.

Pre-commit Hook Optimization

// .lintstagedrc
{
  "*.{js,jsx,ts,tsx}": [
    "oxlint --fix",     // Fast: ~200ms for 50 files
    "eslint --fix --rule 'jsx-a11y/*: error'"  // Only accessibility rules
  ]
}

Type-Aware Linting

Oxlint added type-aware linting support (via TypeScript's type checker) in v0.15+:

{
  "typescript": {
    "tsconfig": "./tsconfig.json"
  },
  "rules": {
    "no-unsafe-assignment": "error",
    "no-unsafe-call": "error",
    "no-unsafe-return": "error"
  }
}

Type-aware linting is 12x faster than ESLint's typescript-eslint equivalent (still uses TypeScript's type checker but with better parallelism).

What Oxlint Can't Replace Yet

ESLint PluginOxlint SupportNotes
eslint-plugin-react-hooksPartialhooks rules covered, not all rules
eslint-plugin-jsx-a11yPartialbasic a11y, not comprehensive
eslint-config-nextNoNext.js-specific rules
eslint-plugin-storybookNoNot yet
@angular-eslintNoNot yet
Custom rulesNoNo plugin API yet

The plugin API is the biggest gap. Oxlint v2 (planned) includes a plugin system, which will enable community-built plugins.

Production Adoption

Shopify

Shopify added Oxlint to their admin codebase (one of the largest React applications). They run Oxlint as a fast pre-commit check and ESLint in CI.

Mercedes-Benz

Reported 71% reduction in lint time after switching. Their codebase had ~80K TypeScript files.

Airbnb

Using Oxlint for their internal TypeScript codebase alongside ESLint.

ESLint's Response

ESLint isn't standing still. The ESLint team has started a "rewrite" project to improve performance:

  • ESLint v9+ with flat config is measurably faster than v8
  • TypeScript ESLint v8 (2025) includes performance improvements
  • A planned Rust-based ESLint is in early research

However, even optimized ESLint is unlikely to close the 50-100x gap with Oxlint.

When to Use Oxlint

Use Oxlint as primary linter if:

  • Starting a new JavaScript/TypeScript project
  • Your codebase doesn't rely on ESLint plugins Oxlint doesn't cover
  • Pre-commit or CI lint time is a significant bottleneck
  • You're working in a plain TypeScript/Node.js project without heavy framework plugins

Use Oxlint alongside ESLint if:

  • You need eslint-plugin-jsx-a11y for accessibility
  • eslint-config-next is required for Next.js
  • Custom ESLint rules are in use
  • You want fast feedback without losing plugin coverage

Stick with ESLint only if:

  • You have complex custom ESLint plugins that Oxlint can't replace
  • Your team is ESLint experts and migration friction isn't worth the speed gain
  • You're using framework-specific tooling that bundles ESLint

npm Package Comparison

PackageWeekly DownloadsGitHub Stars
eslint68M26K
oxlint638K17K
@biomejs/biome500K20K

Oxlint's growth trajectory is steep. At current rates, it'll cross 2M weekly downloads before end of 2026.

Compare on PkgPulse

Track download trends for ESLint vs Oxlint on PkgPulse.

Comments

Stay Updated

Get the latest package insights, npm trends, and tooling tips delivered to your inbox.