Ultracite

by haydenbleaselc162e819eb18No license3.3K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated today

Ultracite is a zero-config linting and formatting preset for JavaScript/TypeScript projects. Use when: (1) Setting up or initializing Ultracite in a project (ultracite init), (2) Running linting or formatting commands (check, fix, doctor), (3) Writing or reviewing JS/TS code in a project that uses Ultracite — to follow its code standards, (4) Troubleshooting linting/formatting issues, (5) User mentions 'ultracite', 'lint', 'format', 'code quality', or 'biome/eslint/oxlint' in a project with Ultracite installed.

Instructions onlySoftware Development
AI-generated overview

Guides setup, use, and troubleshooting of the Ultracite linting and formatting preset for JavaScript/TypeScript projects.

What it does
This skill explains how to detect, initialize, and operate Ultracite, a zero-config linting and formatting preset for JavaScript and TypeScript projects. It documents CLI commands for checking, auto-fixing, diagnosing, and initializing projects, along with init flags for package managers, linter backends, editors, agents, frameworks, and integrations. It also summarizes code standards for writing and reviewing code in Ultracite projects and lists troubleshooting steps for common configuration problems.
When to use it
Use it when setting up Ultracite in a project, running its lint or format commands, or diagnosing setup issues. It also applies when writing or reviewing JavaScript/TypeScript code in a repository that uses Ultracite, or when a user mentions ultracite, lint, format, code quality, or biome/eslint/oxlint.
Requirements
Requires a JavaScript/TypeScript project with a package manager such as npm, yarn, pnpm, bun, deno, nub, or aube, and network access to download the ultracite package when initializing. It ships no scripts; it is instructions only, with a reference document on code standards.

Ultracite

Zero-config linting and formatting for JS/TS projects. Supports three linter backends: Oxlint + Oxfmt (recommended), Biome, and ESLint + Prettier + Stylelint.

Detecting Ultracite

Check if ultracite is in package.json dependencies or devDependencies. Detect the active linter by looking for (searching upward from the current directory):

  • biome.json / biome.jsonc → Biome
  • eslint.config.* (.mjs, .js, .cjs, .ts, .mts, .cts) → ESLint (with Prettier for formatting)
  • oxlint.config.ts → Oxlint (with oxfmt.config.ts for formatting)

CLI Commands

bash
# Check for issues (read-only)bunx ultracite check
# Auto-fix issuesbunx ultracite fix
# Diagnose setup problemsbunx ultracite doctor
# Initialize in a new projectbunx ultracite init

Replace bunx with npx, pnpm exec, or yarn depending on the package manager, so the project's installed Ultracite runs (pnpm dlx and yarn dlx download the latest release instead, and Yarn 1 has no dlx). Only init in a project without Ultracite needs a download runner such as pnpm dlx.

check and fix accept optional file paths: bunx ultracite check src/index.ts. Unknown options are passed through to the underlying linter (e.g. bunx ultracite check --max-warnings 0).

Initialization

bunx ultracite init runs an interactive setup. For non-interactive (CI) use, pass flags:

bash
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 | deno | nub | aube
  • --linter — oxlint (recommended) | biome | eslint
  • --editors — universal (writes .vscode/settings.json for every VS Code-based editor) | vscode | cursor | windsurf | codebuddy | antigravity | bob | kiro | trae | void | zed
  • --agents — universal (writes AGENTS.md) | claude | codex | copilot | cline | amp | gemini | cursor-cli + 34 more (41 agents supported)
  • --frameworks — react | next | solid | vue | svelte | qwik | remix | tanstack | angular | astro | nestjs | jest | vitest
  • --integrations — husky | lefthook | lint-staged | pre-commit
  • --hooks — Enable auto-fix hooks: claude | copilot | cursor | windsurf | codebuddy
  • --js-plugins — Opt-in Oxlint JS plugins: @shadcn/lint | anti-slop | eslint-plugin-github | eslint-plugin-sonarjs | oxlint-plugin-react-doctor
  • --type-aware — Enable type-aware linting (Biome: extends the type-aware preset; Oxlint: installs oxlint-tsgolint)
  • --install-skill — Install the reusable Ultracite skill after setup
  • --skip-install — Skip dependency installation
  • --quiet — Suppress prompts (auto-detected when CI=true); defaults to oxlint when --linter is omitted

Init creates config that extends Ultracite presets:

jsonc
// biome.jsonc{ "extends": ["ultracite/biome/core", "ultracite/biome/react"] }
ts
// eslint.config.mjs — arrays of flat configs, spread togetherimport core from "ultracite/eslint/core";import react from "ultracite/eslint/react";export default [...core, ...react];
ts
// oxlint.config.ts — imports passed to extendsimport { defineConfig } from "oxlint";import core from "ultracite/oxlint/core";export default defineConfig({  extends: [core],  ignorePatterns: core.ignorePatterns,});

Presets available per linter (ultracite/<linter>/<preset>): core, react, next, solid, vue, svelte, qwik, remix, tanstack, angular, astro, nestjs, jest, vitest. Biome also has type-aware. Oxlint also has js-plugins (eslint-plugin-github, eslint-plugin-sonarjs and oxlint-plugin-react-doctor run through oxlint's JS plugin support, with next/js-plugins and tanstack/js-plugins adding framework-specific React Doctor rules), anti-slop and shadcn. These are opt-in: init only adds them when picked in its prompt or passed with --js-plugins. Oxlint and ESLint also have gdp, for codebases that use gdp-ts authorization proofs (@gdp-ts/core ships the plugin); init never adds it, so extend it by hand after core.

Code Standards

When writing code in a project with Ultracite, follow these standards. For the full rules reference, see references/code-standards.md [blocked].

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:

  1. Linter and formatter installation (Biome; or ESLint + Prettier + Stylelint; or Oxlint + oxfmt)
  2. Config validity (extends the ultracite presets correctly)
  3. Ultracite in package.json dependencies
  4. Conflicting tools (legacy .eslintrc.* files; .prettierrc.*/prettier.config.* when not using the ESLint backend)

Common fixes:

  • Conflicting configs: Delete legacy .eslintrc.* and .prettierrc.* files after migrating to Ultracite
  • Missing dependency: Run bunx ultracite init again or manually add ultracite to devDependencies
  • Rules not applying: Ensure config file extends the correct presets for your framework

Source and attribution

Source:haydenbleasel/ultraciteinskills/ultraciteat commitc162e81

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal