Ultracite
Zero-config linting and formatting for JS/TS projects. Supports three linter backends: Biome (recommended), ESLint + Prettier, and Oxlint + Oxfmt.
Detecting Ultracite
Check if ultracite is in package.json devDependencies. Detect the active linter by looking for:
biome.jsonc→ Biomeeslint.config.mjs→ ESLintoxlint.config.ts→ Oxlint
CLI Commands
# Check for issues (read-only)
bunx ultracite check
# Auto-fix issues
bunx ultracite fix
# Diagnose setup problems
bunx ultracite doctor
# Initialize in a new project
bunx ultracite init
Replace bunx with npx, pnpx, or yarn dlx depending on the package manager.
check and fix accept optional file paths: bunx ultracite check src/index.ts.
Initialization
bunx ultracite init runs an interactive setup. For non-interactive (CI) use, pass flags:
bunx ultracite init \
--pm bun \
--linter biome \
--editors universal \
--agents claude copilot \
--frameworks react next \
--integrations husky lint-staged \
--quiet
Flags:
--pm—npm|yarn|pnpm|bun--linter—biome(recommended) |eslint|oxlint--editors—universal(writes.vscode/settings.jsonfor every VS Code-based editor) |vscode|zed|cursor|windsurf|antigravity|kiro|trae|void|bob|codebuddy--agents—claude|codex|copilot|cline|amp|gemini|cursor-cli+ 19 more--frameworks—react|next|solid|vue|svelte|qwik|remix|angular|astro|nestjs--integrations—husky|lefthook|lint-staged|pre-commit--hooks— Enable auto-fix hooks for supported agents/editors--type-aware— Enable type-aware linting (oxlint only)--skip-install— Skip dependency installation--quiet— Suppress prompts (auto-detected whenCI=true)
Init creates config that extends Ultracite presets:
// biome.jsonc
{ "extends": ["ultracite/biome/core", "ultracite/biome/react"] }
Framework presets available per linter: core, react, next, solid, vue, svelte, qwik, remix, angular, astro, nestjs.
Code Standards
When writing code in a project with Ultracite, follow these standards. For the full rules reference, see references/code-standards.md.
Key rules at a glance:
Formatting is handled by the project's configured linter/formatter. Respect the repository's existing formatter settings instead of forcing one fixed line width, quote style, or trailing comma policy.
Type safety: Use explicit types when they improve clarity. Prefer unknown over any. Use as const for immutable values and rely on type narrowing over blunt assertions.
Modern JavaScript/TypeScript: Prefer const, destructuring, optional chaining, nullish coalescing, template literals, for...of, and concise arrow functions.
Async and correctness: Always await promises in async functions. Prefer async/await over promise chains. Remove console.log, debugger, and alert from production code.
React and accessibility: Use function components, keep hooks top-level with correct deps, avoid nested component definitions, and use semantic HTML with the right labels, headings, alt text, and keyboard affordances.
Organization, security, performance, and testing: Keep functions focused, prefer early returns, avoid dangerouslySetInnerHTML and eval(), prefer specific imports and top-level regex, and keep tests free of .only and .skip.
Troubleshooting
Run bunx ultracite doctor to diagnose. It checks:
- Linter installation (biome/eslint/oxlint binary available)
- Config validity (extends ultracite presets correctly)
- Ultracite in package.json dependencies
- Conflicting tools (old
.eslintrc.*,.prettierrc.*files)
Common fixes:
- Conflicting configs: Delete legacy
.eslintrc.*and.prettierrc.*files after migrating to Ultracite - Missing dependency: Run
bunx ultracite initagain or manually addultraciteto devDependencies - Rules not applying: Ensure config file extends the correct presets for your framework