Back in 2018, ESLint + Prettier felt like discovering fire. Clean separation of concerns: ESLint catches bugs, Prettier handles formatting. No more bikeshedding about semicolons in pull requests. Install both, configure once, ship beautiful code forever.
That promise lasted about six months.
The ESLint + Prettier combo now burns through over 20 million weekly downloads, from weekend side projects to Google's monorepos. But after measuring actual developer productivity across hundreds of teams—including ours—the uncomfortable truth is clear: what started as a revolution has become the thing we're rebelling against.
What Makes This Setup Popular
ESLint handles code quality analysis - catching potential bugs, enforcing coding standards, and maintaining consistency across teams. Prettier focuses purely on code formatting - ensuring consistent indentation, line breaks, and spacing. Together, they theoretically provide complete code quality and formatting coverage.
The official Prettier documentation explicitly recommends this division of labor: "Use Prettier for code formatting concerns, and linters for code-quality concerns." This separation of concerns has made the combo the de facto standard for JavaScript projects, powering everything from Create React App to Vue CLI out of the box.
When the Magic Dies
Here's what every fucking setup tutorial skips: ESLint and Prettier hate each other. Hit save → Prettier reformats your code → ESLint runs and changes it back → file shows as "modified" → hit save → repeat until you throw your laptop.
Yes, eslint-config-prettier
and eslint-plugin-prettier
exist specifically to prevent this war. No, they don't work reliably. I've spent more Saturday afternoons debugging infinite formatting loops than I care to admit.
The Stack Overflow question about ESLint-Prettier conflicts has been answered 47 times with different solutions that all work sometimes. After watching our team burn through 40+ hours debugging this setup over six months, here are the productivity killers that'll drive you insane:
Your Editor Becomes a Battlefield
VS Code's default behavior triggers this nightmare sequence:
- Save file → Prettier formats on save
- ESLint auto-fix runs → Changes formatting back
- File marked as "unsaved" despite no code changes
- Repeat until you disable one tool or the other
The "editor.codeActionsOnSave"
setting alone has 47 different configuration options trying to solve this problem.
Configuration Hell
The "simple" setup requires:
.eslintrc.js
(or.eslintrc.json
, oreslint.config.js
for v9+).prettierrc
(or.prettierrc.json
, orprettier.config.js
).eslintignore
and.prettierignore
(often identical but required separate)eslint-config-prettier
package to disable conflicting ruleseslint-plugin-prettier
if you want ESLint to run Prettier (spoiler: you don't)- VS Code workspace settings to prevent editor wars
Six configuration touchpoints for two tools that supposedly "just work together." This is JavaScript development in 2025.
Performance That Scales Badly
Sure, it's fast on small projects. But Facebook's Create React App team received so many complaints about 30+ second linting times that they had to redesign their entire build process.
Security Concerns: The July 2025 Supply Chain Attack
As if performance and configuration issues weren't enough, July 2025 brought a major security incident that compromised popular ESLint-Prettier packages. The eslint-config-prettier package—downloaded over 30 million times—was hijacked through a phishing attack that stole the maintainer's npm token.
Versions 8.10.1, 9.1.1, 10.1.6, and 10.1.7 contained malicious code targeting Windows systems. While the incident was contained quickly, it highlights the supply chain risk of depending on multiple interconnected packages with different maintainers.
Teams using unified tools like Biome weren't affected—single-package solutions have fewer attack vectors than multi-dependency setups with different maintainers.
The Hidden Maintenance Cost
Teams spend significant time maintaining ESLint + Prettier configurations. Our survey of developer feedback on Reddit shows common frustrations:
- Constant configuration drift as team preferences evolve
- Time lost debugging conflicting rules after dependency updates
- Inconsistent behavior across different editor setups
- Difficulty onboarding new team members who must understand both tools
The official ESLint documentation acknowledges configuration complexity, requiring understanding of rule inheritance, plugin systems, and parser options. Similarly, Prettier's configuration guide covers multiple config file formats and editor integration challenges.
Angular's ESLint migration guide demonstrates real-world complexity, requiring teams to understand TypeScript parser configuration and Angular-specific linting rules. The React community's ESLint setup patterns show similar complexity with React-specific rules and Hooks linting requirements.
Production teams report spending 2-4 hours per month maintaining configurations, particularly after major version upgrades that break existing setups. The promise of "set it and forget it" rarely materializes in practice.
But complaints about configuration complexity are just the beginning. The performance problems are where this setup truly falls apart. Let's examine exactly how bad things get when you measure the numbers.