QoQ — Quality over Quantity
A streamlined suite of tools to format, lint, and analyze any JavaScript/TypeScript project with minimal setup.
QoQ orchestrates the static-analysis tools you already rely on — ESLint, Prettier, Knip, JSCPD, Stylelint, Structurelint (file/folder structure linting), and Skillslint (agent-skill linting) — behind a single CLI with sensible, opinionated defaults.
- 🛠 Zero-hassle configuration — set up once with a guided wizard and focus on coding.
- ⚡ Optimized performance — run every tool through one process without redundant overhead.
- 🔬 Precision over bulk — well-curated presets shaped by years of development experience.
Content is verified against
@ladamczyk/qoqv6.1.5. The qoq skill ships from the same repo through theqoq-agent-skillsplugin marketplace, and since v6.1.1 the marketplace version is kept in lockstep with the packages — so v6.1.5 is both. SeeCHANGELOG.mdto verify accuracy.
v6.0.0 is a breaking release for the ESLint presets. Each one now exports
configs.base— a flat-config array toextends, not a pre-merged object to spread — plus its own delta layer (jsLayer,tsLayer, …). See Packages for the migration.
Each tool ships as an independent package under the @ladamczyk/qoq-* namespace, so you can adopt the whole pipeline through the CLI or pull in individual presets à la carte. The whole suite is exposed through three commands:
| Command | Typical use |
|---|---|
qoq --check | Full code check — CI lint step or pre-push hook. |
qoq staged | Checks only staged changes — pre-commit hook. |
qoq --fix | Auto-fixes what it can — run manually after a failure. |
Monorepos are supported out of the box, derived from the workspaces entry in your package.json — no extra configuration required.
Usage statistics
QoQ counts its own runs, and only with your say-so. The first interactive run asks; the answer is stored as stats: true | false in your qoq.config.js and never asked again. The qoq skill reads the same key, so one answer covers both entry points.

Each run posts exactly two values to https://stats.adamczyk.ovh:
- the tool name — the literal
"qoq"from the CLI,"qoq-skill"from the skill; - the command that ran — the value-less flags you typed (
["--check", "--fix"]) or the skill command (["fix"]).
Where an outbound POST never leaves the network, the same two values go as a query string on a plain image GET instead — https://adamczyk.ovh/img/stats/pixel.png?tool=qoq&options=--fix — which counts the same run and carries nothing more.
Never sent: your code, file names, paths, config contents, tool findings, project or package names, and nothing identifying you or your machine. The send is fire-and-forget with a 2s cap shared by both attempts, so a slow or dead endpoint can't hold a run up, and --warmup doesn't count as a run at all.
Changelog
Release history lives in the repo — Releases and CHANGELOG.md. The qoq-agent-skills marketplace version tracks the packages in lockstep since v6.1.1, so one changelog covers both.