Lightning-fast JavaScript Standard Style linting and formatting β‘
A drop-in replacement for ESLint + Prettier built on the Rust-based oxc toolchain. Roughly 50β100Γ faster than the JavaScript equivalents, with a curated preset for TypeScript and React.
- Quick Setup
- For AI Agents
- CLI Reference
- What You Get
- Customization
- VSCode Integration
- Migrating from ESLint/Prettier
- Manual Installation
- Rule Reference
- Contributing
Requirements: Node.js
^20.19.0 || >=22.12.0, matching the bundled oxlint and oxfmt requirements. Development requires Node 22.12+ (22.x), Node 24.x, or Node 26+; Vitest 5 does not support Node 20. For Deno projects, you also need Node alongside Deno becauseoxlintandoxfmtare invoked throughnpx. The CLI itself runs from any package manager'sdlx-style runner.
Replace ESLint/Prettier in your project with one command β works with npm, pnpm, yarn, and bun:
npx oxc-standard # npm
pnpm dlx oxc-standard # pnpm
yarn dlx oxc-standard # yarn (berry)
bunx oxc-standard # bunThe setup auto-detects your package manager (via lockfile, then npm_config_user_agent, then the packageManager field in package.json) and uses the right install/uninstall commands. It then:
- β Removes ESLint, Prettier, and related packages and configs
- β
Installs
oxlintandoxfmtusing the presetβs tested version ranges - β
Writes
.oxlintrc.jsonand.oxfmtrc.json - β
Adds a
lintscript topackage.jsonβ run withnpm run lint/pnpm lint/yarn lint/bun run lint - β
Configures
.vscode/settings.jsonand.vscode/extensions.jsonfor the oxc-vscode extension
Deno doesn't ship a dlx-style runner, so use npx (Node must be installed alongside Deno):
npx oxc-standard --type=denoThe setup will:
- β
Detect your Deno project (via
deno.json[c]or.vscode/settings.jsondeno.enable) - β
Write
.oxlintrc.jsonwith Deno-specific globals and ignore patterns - β
Write
.oxfmtrc.jsonwith Standard Style formatting - β
Add a
linttask todeno.json - β Configure VSCode integration
Then run:
deno task lintPaste this into any coding-agent chat (Copilot, Claude Code, Cursor, opencode, etc.) when you want it to migrate the current repository:
Set up oxc-standard in this project by following https://raw.githubusercontent.com/JohnDeved/ox-standard/main/README.md β auto-detect the package manager and project type, run the CLI non-interactively, then verify the lint script works.
Or, for agents that prefer running a single shell command, point them at the deterministic non-interactive form:
# Node project (auto-detects npm/pnpm/yarn/bun)
npx -y oxc-standard --yes --no-vscode
# Deno project
npx -y oxc-standard --yes --type=deno --no-vscodeThe --yes flag auto-accepts every prompt (required for non-interactive shells) and --no-vscode skips writing .vscode/ files. Drop --no-vscode if you do want VSCode integration.
npx oxc-standard [options]
| Flag | Description |
|---|---|
-y, --yes |
Skip every confirmation prompt (CI / scripted use). |
-t, --type=<node|deno> |
Skip auto-detection and force the project type. |
-n, --dry-run |
Preview every destructive action (file writes, deletes, package installs) without touching anything. Implies --yes. |
--no-vscode |
Skip the .vscode/ integration step. |
-h, --help |
Print the help text and exit. |
Examples:
# Fully non-interactive Node setup (e.g. inside a CI job)
npx oxc-standard --yes --type=node --no-vscode
# Non-interactive Deno setup
npx oxc-standard --yes --type=deno
# Preview what setup would do without changing anything
npx oxc-standard --dry-run --type=node- Sub-second linting and formatting β
oxlintandoxfmtare native Rust binaries shipped via npm. - One command for both β the generated lint script runs
oxlint --fix .followed byoxfmt .(semicolon, not&&, so formatting still runs even if lint reports an unfixable issue). - Standard Style enforced β no semicolons, single quotes, 2-space indent, strict equality, modern ES6+, React-hooks correctness, TypeScript consistency.
- Aligned tool versions β
oxc-standarddeclares the supportedoxlintandoxfmtversions in bothdependenciesandpeerDependencies, so the toolchain stays in sync with the rule set. - VSCode integration on by default β auto-fix and format-on-save via the official
oxc.oxc-vscodeextension.
For projects set up before this refresh, add env (and any required globals) to the existing .oxlintrc.json; setup deliberately leaves existing configs unchanged.
Override individual rules by extending the bundled config. Oxlint does not inherit env or globals through extends; the setup CLI copies them for you. In manually written configs, declare the environments your project uses:
Tweak formatting:
// .oxfmtrc.json
{
"singleQuote": true,
"semi": false,
"printWidth": 120,
"tabWidth": 2,
"trailingComma": "es5",
}The setup writes:
.vscode/settings.jsonβ setsoxc-vscodeas the default formatter, enables format-on-save, enables auto-fix-on-save, and turns on the experimental oxfmt support..vscode/extensions.jsonβ recommendsoxc.oxc-vscode(andtypescriptteam.native-preview).
When you open the project, VSCode will offer to install the recommended extensions. Accept, and lint + format on save just works.
Skip this step entirely with --no-vscode.
Run npx oxc-standard and confirm the prompts. The script will:
- Detect existing ESLint/Prettier configs (
.eslintrc*,eslint.config.*,.prettierrc*,prettier.config.*) and packages (eslint,prettier, common plugins/configs). - Ask before deleting configs.
- Uninstall the legacy packages with your package manager.
- Install and configure
oxc-standard. - Update
.vscode/(unless--no-vscode).
A typical package.json diff after migration:
"scripts": {
- "lint": "eslint . --fix",
+ "lint": "oxlint --fix .; oxfmt ."
},
"devDependencies": {
- "eslint": "^9.0.0",
- "eslint-config-standard": "^17.0.0",
- "prettier": "^3.0.0",
+ "oxc-standard": "^1",
+ "oxfmt": "^0.67.0",
+ "oxlint": "^1.82.0"
}The script only touches
scripts.lint. If you have a separatescripts.formatcallingprettier --write, you'll want to remove it manually βoxfmtalready runs as part oflint.
Prefer to skip the script? Pick the install command for your package manager:
npm install --save-dev oxc-standard
pnpm add --save-dev oxc-standard
yarn add --dev oxc-standard
bun add --dev oxc-standardecho '{"extends": ["./node_modules/oxc-standard/.oxlintrc.json"], "env": {"browser": true, "node": true}}' > .oxlintrc.json
cp node_modules/oxc-standard/.oxfmtrc.json .oxfmtrc.json
npm pkg set scripts.lint="oxlint --fix .; oxfmt ."Add a task to deno.json:
{
"tasks": {
"lint": "npx oxlint --fix . && npx oxfmt .",
},
}Then run deno task lint.
The preset combines explicit rule settings with correctness: error and suspicious: warn across 6 plugins (unicorn, typescript, oxc, react, react_perf, import) plus core ESLint rules. Category defaults automatically include newly supported checks; the explicit settings tune their severity and select additional style/performance rules. The full configuration lives in .oxlintrc.json.
The September 2026 refresh targets oxlint 1.82.0 and oxfmt 0.67.0. It enables the import plugin (previously configured import rules were inactive), replaces typescript/no-empty-interface with typescript/no-empty-object-type, and adds the following explicit selections:
| Rules | Level | Purpose |
|---|---|---|
prefer-regex-literals |
Error | Use literal regular expressions when the pattern is static. |
no-implied-eval, unicorn/no-array-fill-with-reference-type, oxc/bad-match-all-arg |
Error | Catch string-based timer evaluation, shared references in array fills, and non-global matchAll expressions. |
prefer-arrow-callback, unicorn/explicit-timer-delay, unicorn/prefer-export-from, unicorn/prefer-single-call |
Warning | Prefer concise callbacks, explicit delays, direct re-exports, and combined collection updates. |
react/no-object-type-as-default-prop, react/no-unstable-nested-components |
Warning | Avoid unstable default props and components recreated during rendering. |
The React plugin also gains compiler-backed correctness checks through the existing category defaults, including render purity and state-update checks. No React Compiler build integration is required to lint these patterns.
The default setup stays syntax-only and does not install oxlint-tsgolint. Configured rules that require type information (such as typescript/prefer-nullish-coalescing and typescript/no-unnecessary-type-assertion) only run when type-aware linting is enabled. To opt in for a TypeScript project with a tsconfig.json:
npm install --save-dev oxlint-tsgolint@^7.0.2001// .oxlintrc.json
{
"extends": ["./node_modules/oxc-standard/.oxlintrc.json"],
"env": { "browser": true, "node": true },
"options": { "typeAware": true },
}See the upstream type-aware guide for setup details. The highlights below include both syntax-only and opt-in type-aware rules.
JavaScript Standard Style
eqeqeq- Strict equality (===)no-var- Useconst/letyoda- Readable comparisonsno-constructor-return- No return values from constructorsno-self-compare- Flagsx === xtautologiesno-else-return- Removes redundant else after return
Modern JavaScript
prefer-template- Template literalsprefer-destructuring- Modern patternsprefer-object-spread- Clean objectsno-duplicate-imports- Organized imports
React Best Practices
rules-of-hooks- Proper hooks usagejsx-curly-brace-presence- Clean JSXself-closing-comp- Concise componentsjsx-no-duplicate-props- Catches duplicate prop bugsvoid-dom-elements-no-children- No children on<img>,<br>etc.no-danger(warn) - FlagsdangerouslySetInnerHTMLjsx-no-constructed-context-values(warn) - Prevents needless re-rendersreact_perf/jsx-no-jsx-as-prop(warn) - JSX in props causes re-renders
TypeScript Integration
consistent-type-imports- Clean importsarray-type- Consistent syntaxprefer-as-const- Type assertionsprefer-optional-chain-a?.bovera && a.bprefer-nullish-coalescing-??over||for null checksno-unnecessary-qualifier- Removes redundant namespace qualifiersno-useless-empty-export- Removes redundantexport {}no-duplicate-enum-values/no-mixed-enums- Enum correctness guardsno-unsafe-declaration-merging- Class+interface merge safetyno-empty-object-type(warn) - Avoids misleading empty interfaces and{}types
Enhanced Patterns (Unicorn)
prefer-includes- Better array methodsprefer-string-starts-ends-with- Modern stringsthrow-new-error- Proper errorsprefer-string-slice-.slice()over.substring()prefer-node-protocol-'node:fs'over'fs'prefer-negative-index-arr.at(-1)overarr[arr.length - 1]prefer-structured-clone-structuredClone()over JSON round-tripno-negated-condition- Flips negated if/ternary for readabilityno-typeof-undefined-x === undefinedovertypeof xno-lonely-if- Hoists loneifout ofelseno-useless-promise-resolve-reject- Removes redundant wrappersno-instanceof-array-Array.isArray()overinstanceof Arrayno-negation-in-equality-check-!!x === yinstead of!x === yrequire-array-join-separator- Explicit separator in.join()
Performance (Oxc) & Import Safety
no-accumulating-spread- Prevents O(nΒ²) spread in loopsno-map-spread(warn) - Spread in map callbacksimport/no-cycle- Detects circular imports
Found an issue or want to suggest improvements? Open an issue or submit a pull request.
Local development:
npm ci
npm run check # build + read-only lint/format checks + all tests
npm run lint # auto-fix lint issues and format the repositoryCI runs the full check on Node 22, 24, and 26 across Linux and macOS, plus a smoke test of the setup CLI against npm, pnpm, yarn, bun, and Deno.
MIT Β© Johann Berger