Config files should be short
// .eslintrc.json — 200+ lines of this
{
"extends": ["eslint:recommended", "prettier"],
"plugins": ["@stylistic"],
"rules": {
"semi": ["error", "never"],
"quotes": ["error", "double"],
"indent": ["error", 2],
"@stylistic/arrow-parens": ["error", "as-needed"],
"@stylistic/brace-style": ["error", "1tbs"],
"@stylistic/keyword-spacing": ["error", {
"before": true, "after": false,
"overrides": { "return": { "after": true } }
}],
// ... another 50 rules ...
}
}
// And you still need prettier.config.js too.
// eslint.config.js — that's it, that's the whole file
import uglify from "@gesslar/uglier"
export default [
...uglify({
with: [
"lints-js",
"lints-jsdoc",
"node",
]
})
]
Everything you need, nothing you don't
Composable Blocks
Mix and match from 10 config blocks. Node, React, Tauri, VSCode extensions — pick what you need, skip what you don't.
No Prettier Required
All formatting handled by ESLint alone. No conflicting tools, no extra configs, no arguing about semicolons.
Flat Config Native
Built for ESLint v9+ flat configs from the ground up. No legacy compatibility layers or .eslintrc baggage.
CLI Setup
One command to install, init, add, or remove configs. Detects your package manager automatically.
Fully Customizable
Override indent, max line length, file patterns, and individual rules per config block. Opinionated defaults, flexible escape hatches.
TypeScript Ready
Full TypeScript definitions generated from JSDoc. Autocomplete and type checking for all options.
Pick your path
Quick Start
Install uglier and have a working ESLint config in under two minutes.
Configs
Explore each of the 10 composable config blocks and what they enforce.
Customization
Override indent, line length, file patterns, and individual rules per block.
Reference
Complete API documentation, CLI commands, and type definitions.
Nerds
Read the actual source for every config block. The actual source for every config block. No trust fall required.