Biome Configuration
Deep Knowledge: Use mcp__documentation__fetch_docs with technology: biome for comprehensive documentation.
When NOT to Use This Skill
This skill is specific to Biome tooling. Do NOT use for:
-
ESLint configuration - Biome replaces ESLint; migrate or use ESLint skills
-
Prettier configuration - Biome replaces Prettier; migrate or use Prettier docs
-
TypeScript type checking - Use tsc , not Biome (Biome doesn't type check)
-
Build process - Use bundler skills (Vite, Webpack, etc.)
-
Testing setup - Use testing framework skills (Vitest, Jest, etc.)
-
Code quality principles - Use clean-code skill for what to fix, not how to configure
Anti-Patterns
Anti-Pattern Why It's Bad Biome Best Practice
Disabling recommended rules Misses important issues Keep recommended, customize only what's needed
Ignoring all warnings Warnings indicate real issues Fix warnings or suppress with reason
No CI integration Issues slip through Use biome ci in CI pipeline
Manual formatting Inconsistent, waste time Use format on save + pre-commit hooks
Mixing ESLint + Biome Conflicting rules, confusion Fully migrate to Biome or stay with ESLint
No VS Code integration Manual CLI runs Install Biome extension, enable format on save
Ignoring complexity rules Allows unmaintainable code Set cognitive complexity limits
Committing formatting issues Messy diffs Use pre-commit hooks with lint-staged
Quick Troubleshooting
Issue Check Solution
Biome not formatting VS Code extension installed? Install biomejs.biome , set as default formatter
Format on save not working Settings.json configured? Add "editor.formatOnSave": true
Rules not applying biome.json syntax valid? Run biome check to validate config
Too many warnings Rules too strict? Adjust severity levels or disable specific rules
CI failing Different results locally? Ensure same Biome version, check ignore patterns
Conflicts with Prettier Both running? Remove Prettier, Biome replaces it
Slow on large codebase Checking too many files? Add ignore patterns in biome.json
Can't migrate from ESLint Complex config? Use biome migrate eslint , review output
Installation
npm install --save-dev @biomejs/biome
Initialize configuration
npx @biomejs/biome init
biome.json Configuration
{ "$schema": "https://biomejs.dev/schemas/1.9.0/schema.json", "organizeImports": { "enabled": true }, "linter": { "enabled": true, "rules": { "recommended": true, "complexity": { "noExcessiveCognitiveComplexity": { "level": "warn", "options": { "maxAllowedComplexity": 15 } } }, "correctness": { "noUnusedVariables": "warn", "noUnusedImports": "warn", "useExhaustiveDependencies": "warn" }, "style": { "noNonNullAssertion": "off", "useImportType": "warn" }, "suspicious": { "noExplicitAny": "warn" } } }, "formatter": { "enabled": true, "formatWithErrors": false, "indentStyle": "space", "indentWidth": 2, "lineWidth": 100 }, "javascript": { "formatter": { "quoteStyle": "single", "trailingCommas": "es5", "semicolons": "always" } }, "files": { "ignore": [ "node_modules", "dist", "build", ".next", "coverage", "*.gen.ts" ] } }
Package.json Scripts
{ "scripts": { "lint": "biome check .", "lint:fix": "biome check --write .", "format": "biome format --write .", "check": "biome check --write --unsafe ." } }
Common Rules
Rule Level Description
noUnusedVariables
warn Flag unused variables
noUnusedImports
warn Flag unused imports
noExplicitAny
warn Discourage any type
useExhaustiveDependencies
warn Check React hook deps
noNonNullAssertion
off Allow ! operator
useImportType
warn Prefer import type
VS Code Integration
// .vscode/settings.json { "editor.defaultFormatter": "biomejs.biome", "editor.formatOnSave": true, "[javascript]": { "editor.defaultFormatter": "biomejs.biome" }, "[typescript]": { "editor.defaultFormatter": "biomejs.biome" }, "[typescriptreact]": { "editor.defaultFormatter": "biomejs.biome" } }
Pre-commit Hook
Install husky
npm install --save-dev husky lint-staged
package.json
{ "lint-staged": { "*.{js,jsx,ts,tsx}": [ "biome check --write --no-errors-on-unmatched" ] } }
Migration from ESLint/Prettier
Biome can migrate your config
npx @biomejs/biome migrate eslint --write npx @biomejs/biome migrate prettier --write
CLI Commands
Check all files
biome check .
Fix issues
biome check --write .
Format only
biome format --write .
Lint only
biome lint .
Check specific files
biome check src/components/**/*.tsx
CI mode (exit with error)
biome ci .
Ignoring Code
// Ignore next line // biome-ignore lint/suspicious/noExplicitAny: needed for legacy API const data: any = await fetch('/api');
// Ignore whole file (at top) // biome-ignore-all lint/style/useImportType
Production Readiness
Recommended Configuration
{ "$schema": "https://biomejs.dev/schemas/1.9.0/schema.json", "organizeImports": { "enabled": true }, "linter": { "enabled": true, "rules": { "recommended": true, "a11y": { "recommended": true }, "complexity": { "noExcessiveCognitiveComplexity": { "level": "error", "options": { "maxAllowedComplexity": 15 } }, "noExcessiveNestedTestSuites": "warn" }, "correctness": { "noUnusedVariables": "error", "noUnusedImports": "error", "useExhaustiveDependencies": "error" }, "performance": { "noAccumulatingSpread": "warn", "noDelete": "warn" }, "security": { "noDangerouslySetInnerHtml": "error", "noGlobalEval": "error" }, "suspicious": { "noExplicitAny": "warn", "noConsoleLog": "warn" } } }, "formatter": { "enabled": true, "indentStyle": "space", "indentWidth": 2, "lineWidth": 100 }, "javascript": { "formatter": { "quoteStyle": "single", "trailingCommas": "es5", "semicolons": "always" } }, "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true } }
CI Integration
.github/workflows/lint.yml
name: Lint
on: [push, pull_request]
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- name: Biome CI
run: npx @biomejs/biome ci .
# Or with caching
- name: Cache Biome
uses: actions/cache@v4
with:
path: ~/.cache/biome
key: ${{ runner.os }}-biome-${{ hashFiles('biome.json') }}
- name: Check
run: npx @biomejs/biome check --diagnostic-level=error .
Git Hooks
// package.json { "scripts": { "prepare": "husky install", "lint": "biome check .", "lint:fix": "biome check --write .", "lint:ci": "biome ci ." }, "lint-staged": { "*.{js,jsx,ts,tsx,json}": [ "biome check --write --no-errors-on-unmatched --files-ignore-unknown=true" ] } }
.husky/pre-commit
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
Error Handling
// biome.json - Configure severity levels { "linter": { "rules": { // Block CI on these "correctness": { "noUnusedVariables": "error", "useExhaustiveDependencies": "error" }, // Allow in development, fail in CI "suspicious": { "noConsoleLog": { "level": "warn", "options": {} } } } } }
// Stricter CI check // package.json { "scripts": { "lint:dev": "biome check .", "lint:ci": "biome check --diagnostic-level=error --max-diagnostics=50 ." } }
Testing Integration
// vitest.config.ts - Run biome before tests import { defineConfig } from 'vitest/config';
export default defineConfig({ test: { globalSetup: './src/test/global-setup.ts', }, });
// src/test/global-setup.ts import { execSync } from 'child_process';
export default function setup() { try { execSync('npx @biomejs/biome check .', { stdio: 'pipe' }); } catch (error) { console.error('Biome check failed. Fix linting issues before running tests.'); process.exit(1); } }
Monitoring Metrics
Metric Target
Lint errors 0
Warnings < 10
Format issues 0
Cognitive complexity < 15
Checklist
-
Recommended rules enabled
-
Security rules enabled
-
a11y rules enabled
-
Cognitive complexity limit
-
CI integration with biome ci
-
Pre-commit hooks with lint-staged
-
VS Code extension configured
-
Console.log warnings
-
Unused variables as errors
-
VCS integration enabled
Reference Documentation
-
Rules Reference
-
VS Code Setup