An opinionated, zero-config ESLint wrapper for JavaScript/TypeScript with great defaults and automatic fixes.
XO is an opinionated linter for JavaScript and TypeScript that wraps ESLint with curated defaults to enforce consistent code style. It requires minimal configuration, automatically lints all relevant files, and includes useful plugins to catch common issues. The tool helps teams avoid style debates by providing a sensible baseline that 'just works' while remaining fully configurable.
JavaScript and TypeScript developers, especially those working in teams who want to enforce code style consistency without spending time configuring ESLint rules. It's ideal for projects seeking a 'batteries-included' linting setup.
Developers choose XO because it reduces setup time to near zero with smart defaults, includes a curated set of modern ESLint plugins out of the box, and offers automatic fixes for many issues. Its pragmatic approach balances strong opinions with configurability, making it easier to maintain consistent code across projects.
❤️ JavaScript/TypeScript linter (ESLint wrapper) with great defaults
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
XO works immediately by linting all JS/TS files with sensible defaults, ignoring common paths automatically, so you can enforce code style without any initial setup.
It includes powerful ESLint plugins like unicorn and import-x out of the box, catching a wide range of code quality issues without manual installation or configuration.
XO seamlessly lints TypeScript files, automatically detecting and using tsconfig.json, eliminating the need for separate TypeScript linting setup or complex parser options.
With built-in caching, XO speeds up subsequent lint runs in large projects by reusing previous results, making it efficient for continuous integration workflows.
XO mandates that your project uses ESM modules, which forces a migration from CommonJS and can be a significant barrier for legacy codebases or tools not supporting ESM.
While zero-config for basics, overriding defaults or adding framework-specific linting requires understanding and managing ESLint's flat config, which can be daunting and error-prone.
The included plugins and strict defaults, like enforcing semicolons or tab indentation, might impose rules that some teams find unnecessary, requiring explicit configuration to disable or adjust.