---
title: "Differences from antfu/eslint-config"
description: "Explicit list of how @vinicunca/eslint-config diverges from its antfu/eslint-config upstream."
canonical_url: "https://vinicunca.dev/eslint/guides/differences-from-antfu"
---
# Differences from antfu/eslint-config

> Explicit list of how @vinicunca/eslint-config diverges from its antfu/eslint-config upstream.

`@vinicunca/eslint-config` is a fork of [antfu/eslint-config](https://github.com/antfu/eslint-config). Integrations, plugins and the composer API come from that project. This page lists the differences that matter when you switch or compare docs.

## API and packaging

|  | antfu/eslint-config | @vinicunca/eslint-config |
| --- | --- | --- |
| Factory | Default export `antfu()` | Named export `vinicuncaESLint()` — **no default export** |
| Config names | `antfu/*` | `vinicunca/*` |
| CLI wizard | `pnpm dlx @antfu/eslint-config@latest` | **None** — write `eslint.config.js` yourself |
| Angular | `angular: true` | **No `angular` option** |
| ESLint peer | See antfu's `package.json` | `^10.0.0` |

## Code style

|  | antfu | vinicunca |
| --- | --- | --- |
| Semicolons | Off (`semi: false`) | **On** (`semi: true`) |
| Quotes | Single | Single |
| Indent | 2 spaces | 2 spaces |
| `style/arrow-parens` | From Stylistic customize (as-needed) | **Always** `(x) => x` |
| `curly` | Depends on `lessOpinionated` | **Always** `'all'` |
| `antfu/top-level-function` | Off when `lessOpinionated` | **Always on** |
| `stylistic.braceStyle` default | `'stroustrup'` and applied | `'stroustrup'` in defaults, but `style/brace-style` is then set **without options**, so JS/TS use **`1tbs`** (`} else {`). Vue templates still use `vue/brace-style` with `'stroustrup'`. |
| `lessOpinionated` | Relaxes several opinionated rules | **Accepted, does nothing** — `stylistic.ts` never reads it |

## React and plugins

- React needs `@eslint-react/eslint-plugin` and `eslint-plugin-react-refresh` only — not `eslint-plugin-react-hooks`.
- Plugin rename map includes `@eslint-react` → `react` (write `react/*` in overrides).
- Editor non-fixable rules: `prefer-const`, `unused-imports/no-unused-imports`, `test/no-only-tests` only.

## Auto-detect and extras

- **pnpm** workspace rules turn on when `pnpm-workspace.yaml` exists (antfu documents this as off / experimental by default).
- **UnoCSS attributify** defaults to `false` (antfu's types often say `true`).
- **e18e** is on by default (same family of rules as upstream, with array-copy rules and `prefer-static-regex` off unless you override them).
- **antislop** is **on** by default. `eslint-plugin-slop` and `eslint-plugin-sonarjs` are regular dependencies, so there is nothing extra to install. Set `antislop: false` to turn it off.

## What stayed the same

Flat config composition (`options` + extra configs + composer methods), `.gitignore` support, Stylistic instead of Prettier for JS/TS, Vue auto-detect, optional formatters, type-aware TypeScript via `tsconfigPath`, and the plugin set for JSON/YAML/TOML/Markdown/Vitest.


## Sitemap

See the full [sitemap](https://vinicunca.dev/sitemap.md) for all pages.
