{
  "id": 18823304,
  "title": "Oxlint JS Plugins: Your Custom ESLint Rules No Longer Keep You on ESLint",
  "url": "https://urgent.news/2026/11/08/oxlint-js-plugins-your-custom-eslint-rules-no-longer-keep-you-on",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-11-08T00:24:29.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/grimicorn/oxlint-js-plugins-your-custom-eslint-rules-no-longer-keep-you-on-eslint-4g28"
  },
  "original_language": "en",
  "account": "Oxlint, a JavaScript plugin for ESLint, has improved the custom rule experience for developers. With the latest alpha release in March 2026, roughly 80% of ESLint users can seamlessly switch to Oxlint without any issues. The key advantage is its compatibility with ESLint's plugin API while running Rust rules alongside native JavaScript rules. This hybrid approach allows users to keep their existing rules and only pay the JavaScript price for rules that require it.\n\nTo implement this, configure the jsPlugins array in your config file with valid import specifiers, pointing to either npm packages or local files. For example, you can enable eslint-plugin-testing-library and a local lint/rules.js file. Oxlint runs its JS plugin layer against ESLint's rule test suite (33,006 tests, 100% passing) and popular plugins like eslint-plugin-react-hooks, ESLint Stylistic, Testing Library, and SonarJS, achieving at or near 100% compatibility.\n\nName collisions are handled through aliasing, allowing you to use native rules when available and fall back to npm packages for the rest. For example, Oxlint implements some plugins natively (like jsdoc and react) but not all rules within them. The oxlint-plugin-eslint package offers all ESLint's built-in rules as a JS plugin under the eslint-js prefix, enabling seamless migration.\n\nWriting rules in Oxlint is similar to ESLint, with the same create(context) API. An alternative createOnce API is available for new rules, offering better performance by running once per file instead of per AST node. This allows Oxlint to learn visitors upfront and skip files that contain none of the relevant nodes, reducing the Rust/JS boundary crossing.\n\nThe migration process is simple, requiring a single command against your flat config: npx @oxlint/migrate eslint.config.js. In practice, Oxlint significantly outperforms ESLint, with the Node.js repo example taking just 21 seconds compared to ESLint's 1 minute 43 seconds. However, projects relying heavily on TypeScript-eslint may see even greater performance gains due to type-aware linting.\n\nThree crucial factors to consider before fully migrating away from ESLint are Vue, Svelte, and Angular templates, custom file formats and parsers, and custom type-aware rules. If your rules need to handle templates or type-checking, keep ESLint for those files for now. Additionally, slow plugins remain slow in Oxlint, as it provides a fast parser but cannot optimize plugins that hit the filesystem excessively.",
  "summary": "Every team that has looked at Oxlint has hit the same wall. The benchmarks are great, the built-in rules cover most of what you use, and then someone remembers the twelve custom rules in eslint-local-rules/ , plus eslint-plugin-testing-library , plus that one SonarJS rule the security folks insisted on. None of that exists in Rust, so the migration dies in the planning doc and CI keeps spending…",
  "key_points": [
    "Oxlint improves custom ESLint rules with hybrid Rust/JS approach",
    "80% of ESLint users can switch to Oxlint with minimal issues",
    "Migration simple via npx @oxlint/migrate eslint.config.js command"
  ],
  "editors_take": "Hybrid compatibility between Rust and JavaScript allows developers to accelerate linting speeds without abandoning the custom rules and ecosystem that define their existing workflows.",
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}