Skip to main content

uglier

Opinionated, composable ESLint flat configs for the rest of us.

Config files should be short

Without Uglier — sprawling JSON config

// .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.
With Uglier — composable, readable, done

// 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.

v9

Flat Config Native

Built for ESLint v9+ flat configs from the ground up. No legacy compatibility layers or .eslintrc baggage.

npx

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.

.ts

TypeScript Ready

Full TypeScript definitions generated from JSDoc. Autocomplete and type checking for all options.