Oxlint — High-Performance JS/TS Linter
Oxlint is 50-100x faster than ESLint. It ships with 690+ rules covering ESLint core, TypeScript, React, Jest, Unicorn, jsx-a11y, and more. It prioritizes high-signal correctness checks by default — things that are incorrect, unsafe, or useless — so teams can adopt it without drowning in false positives.
Detection
Before linting, confirm the project uses oxlint by checking for any of:
-
oxlint in package.json devDependencies/dependencies
-
An .oxlintrc.json file in the project root
-
An oxlint.config.ts file in the project root
-
An oxlint or lint script in package.json that references oxlint
If none of these exist, the project doesn't use oxlint — don't run it.
Running Oxlint
After code changes
Run oxlint to check your work. Prefer the project's npm script if one exists:
If package.json has a lint script using oxlint
npm run lint
Otherwise, run directly
npx oxlint
Fixing issues automatically
npx oxlint --fix
Use --fix for safe automatic fixes. Avoid --fix-dangerously unless the user explicitly asks for it — it can apply unsafe transformations.
Linting specific files
After editing only a few files, you can lint just those:
npx oxlint src/components/Button.tsx src/utils/helpers.ts
Interpreting output
Oxlint prints diagnostics with rule names in parentheses, e.g. (no-unused-vars) . When fixing:
-
Read the diagnostic message carefully — oxlint gives precise, actionable information
-
Fix the underlying code issue rather than suppressing the rule
-
Only add // oxlint-ignore comments as a last resort when the diagnostic is a genuine false positive
Output formats
For CI or tooling integration:
npx oxlint --format json # Machine-readable JSON npx oxlint --format github # GitHub Actions annotations npx oxlint --format unix # Simple one-line-per-error format
Configuration
Creating a config
npx oxlint --init
This generates an .oxlintrc.json starter config.
Config file format (.oxlintrc.json)
The config uses JSONC (JSON with comments). Key sections:
{ // Enable/disable individual rules with severity levels "rules": { "no-unused-vars": "error", "no-console": "warn", "no-plusplus": ["error", { "allowForLoopAfterthoughts": true }] },
// Enable groups of related rules by category "categories": { "correctness": "error", // Definitely-wrong code "suspicious": "warn", // Probably-wrong code "pedantic": "off", // Opinionated style checks "perf": "warn", // Performance anti-patterns "style": "off", // Cosmetic preferences "restriction": "off", // Extra-strict rules (opt-in) "nursery": "off" // Unstable/experimental rules },
// Plugins to enable (setting this overwrites defaults, so list all you want) "plugins": ["typescript", "unicorn", "oxc"],
// File-specific overrides "overrides": [ { "files": ["/*.test.{ts,tsx}"], "rules": { "no-console": "off" } }, { "files": ["scripts/"], "rules": { "no-console": "off" } } ],
// Environment globals "env": { "browser": true, "node": true },
// Plugin-wide settings "settings": { "react": { "linkComponents": [{ "name": "Link", "linkAttribute": "to" }] }, "jsx-a11y": { "components": { "Link": "a", "Button": "button" } } },
// Type-aware linting (requires tsconfig) "options": { "typeAware": true } }
Rule severity levels
-
"off" / "allow" — Disable the rule
-
"warn" — Report but don't fail the build
-
"error" / "deny" — Report and exit non-zero
Unique rule names can omit plugin prefix: "no-console" = "eslint/no-console" .
Categories
Categories group rules by intent. The recommended starting point:
-
correctness: "error" — Always on. Catches real bugs.
-
suspicious: "warn" — Good signal, occasionally noisy.
-
Everything else: enable incrementally as the team is ready.
Available plugins
Enabled by default: typescript , unicorn , oxc
Opt-in (CLI flags or config):
Plugin CLI flag Purpose
react --react-plugin
React-specific rules
jsx-a11y --jsx-a11y-plugin
Accessibility rules for JSX
nextjs --nextjs-plugin
Next.js best practices
import --import-plugin
Import/export validation
jest --jest-plugin
Jest testing rules
vitest --vitest-plugin
Vitest testing rules
jsdoc --jsdoc-plugin
JSDoc documentation rules
node --node-plugin
Node.js-specific rules
promise --promise-plugin
Promise best practices
react-perf --react-perf-plugin
React performance rules
vue --vue-plugin
Vue.js rules
To disable a default plugin: --disable-typescript-plugin , --disable-unicorn-plugin , --disable-oxc-plugin .
Extending shared configs
{ "extends": ["./configs/base.json", "./configs/frontend.json"] }
Later entries override earlier ones. Paths resolve relative to the declaring config.
Monorepo support
Oxlint supports nested configs. Each directory can have its own .oxlintrc.json that overrides parent settings. Disable with --disable-nested-config if unwanted.
CLI Quick Reference
Flag What it does
-c, --config=PATH
Use a specific config file
--tsconfig=PATH
TypeScript config for path aliases
--fix
Auto-fix safe issues
--fix-suggestions
Also apply suggested fixes
-A, --allow=RULE
Suppress a rule (e.g., -A no-console )
-W, --warn=RULE
Warn on a rule
-D, --deny=RULE
Error on a rule
--quiet
Suppress warnings, show only errors
--deny-warnings
Treat warnings as errors (exit non-zero)
--max-warnings=N
Fail if more than N warnings
-f, --format=FMT
Output format: default, json, github, unix, etc.
--ignore-pattern=PAT
Exclude files matching pattern
--type-aware
Enable type-informed rules (needs tsconfig)
--print-config
Show resolved config (useful for debugging)
--rules
List all available rules
Categories can also be used with -A /-W /-D :
npx oxlint -D correctness -W suspicious -A pedantic
Suppressing rules inline
// oxlint-ignore no-console -- needed for debug logging console.log(debugInfo);
// oxlint-ignore-next-line no-unused-vars const _placeholder = computeValue();
Use oxlint-ignore (not eslint-disable ) — oxlint recognizes both, but prefer its native syntax.
Migrating from ESLint
If the project is moving from ESLint to oxlint:
Side-by-side approach — Run both linters, with eslint-plugin-oxlint disabling rules that oxlint already covers:
npm install -D eslint-plugin-oxlint
Add it as the last plugin in your ESLint config.
Full replacement — Use @oxlint/migrate to convert your ESLint config:
npx @oxlint/migrate
This generates an .oxlintrc.json from your existing ESLint configuration.
Supported file types
.js , .mjs , .cjs , .ts , .mts , .cts , .jsx , .tsx , .vue , .svelte , .astro
For .vue , .svelte , and .astro files, oxlint lints only the <script> blocks.