Project history
ESLint appeared on npm in 2013 and reached 1.0.0 in July 2015. The official 1.0.0 announcement described that milestone as the first major release after more than two years of work and as the stable base for future growth.
The project differentiated itself from JSLint and JSHint by using Espree for parsing, evaluating code through an AST, and making every rule pluggable. That architecture made ESLint attractive both as an end-user CLI and as a library for editor integrations, shareable configs, and custom rule packages.
Configuration has been one of ESLint's major historical arcs. The original eslintrc system accumulated multiple file formats and lookup rules; in 2022 the project introduced flat config, centered on `eslint.config.js`, as a simpler model. ESLint v9.0.0 made flat config the default and officially deprecated eslintrc.
Adoption history
ESLint became a default dependency in JavaScript projects because it solved both style and correctness checks through one package ecosystem. The README links npm version and download badges, Open Collective funding, official docs, rules, contribution paths, and scheduled releases, reflecting a mature tool maintained as public infrastructure.
The plugin and shareable-config model drove adoption beyond core JavaScript. React, TypeScript, framework, import-order, accessibility, security, and formatting-adjacent workflows all built on ESLint's rule API, which made `eslint` a central package in Node.js development even when a project used higher-level presets.
The official release process also shaped adoption: the project publishes scheduled releases every two weeks and documents semver policies for rule, CLI, formatter, and API changes, which matters because lint rule updates can change build outcomes.
How it is used
Typical package-manager usage starts with `npm init @eslint/config@latest` and then `npx eslint yourfile.js`, while Homebrew and OS packages provide an `eslint` executable for users who install developer tools outside a project-local npm workflow.
Current ESLint configuration lives in a project-root flat config file named `eslint.config.js`, `eslint.config.mjs`, `eslint.config.cjs`, or a TypeScript variant with additional setup. Those files export configuration objects that set rules, plugins, language options, ignores, processors, and related linting behavior.
ESLint is used directly in terminals and CI, indirectly through editor integrations, and as an API consumed by other tools. Its significance in package-manager culture comes from how often it appears in `devDependencies`, lockfiles, shareable configs, monorepo lint scripts, and pre-commit or CI quality gates.
Why package nerds care
For package nerds, ESLint is a canonical example of a package ecosystem forming around a stable extension API: parser packages, plugins, config packages, formatter packages, and editor tooling all orbit the core package.
It is also one of the clearest examples of why developer-tool packages need careful semver. A minor rule behavior change can create new warnings, a major config migration can affect nearly every JavaScript project, and the project's own semver policy documents those tradeoffs explicitly.
Timeline
- 2013: ESLint first appears on npm.
- 2015: ESLint 1.0.0 released as the first major release.
- 2022: Flat config introduced publicly as a new configuration system.
- 2024: ESLint 9.0.0 makes flat config the default and deprecates eslintrc.
- 2026: ESLint 10.x releases continue the scheduled release cadence.
Related projects
- ESLint is historically compared with JSLint and JSHint, and its ecosystem intersects with Espree, typescript-eslint, Babel parser integrations, eslint-plugin-react, Prettier, editor integrations, and shareable config packages.