Setup Lefthook Git Hooks
Prerequisites
- Biome must be installed (
biome.jsonshould exist) - TypeScript must be configured (
tsconfig.jsonshould exist) - Git repository must be initialized
Installation Steps
First, verify prerequisites exist:
# Check for biome.json and tsconfig.json
ls biome.json tsconfig.json
- Install lefthook as dev dependency:
bun add -d lefthook
- Create
.lefthook.ymlconfiguration:
Ask the user: "Do you want the basic configuration (just linting and type checking) or the full configuration (includes Vercel & Sanity deployment)?"
Then create the appropriate configuration:
Basic Configuration (Recommended for most projects)
pre-commit:
parallel: true
commands:
lint:
run: bunx biome check --write --staged --unsafe || (echo "No files to lint" && exit 0)
types:
run: bunx tsc --noEmit
pre-push:
commands:
check-types:
run: bunx tsc --noEmit
lint-ci:
run: bunx biome ci . --max-diagnostics=100 --files-ignore-unknown=true
Full Configuration (Includes Vercel & Sanity deployment)
Only use if project has Vercel and Sanity configured:
pre-commit:
parallel: true
commands:
lint:
run: bunx biome check --write --staged --unsafe || (echo "No files to lint" && exit 0)
types:
run: bunx tsc --noEmit
pre-push:
commands:
check-types:
run: bunx tsc --noEmit
lint-ci:
run: bunx biome ci . --max-diagnostics=100 --files-ignore-unknown=true
build-deploy:
interactive: true
run: vercel build --prod && vercel deploy --prebuilt --prod --archive=tgz && bunx sanity deploy
- Install git hooks:
bunx lefthook install
What This Configures
Pre-commit (runs in parallel):
- Lint: Auto-fixes staged files with Biome
- Types: Validates TypeScript types
Pre-push (Basic):
- Check types: Full TypeScript validation
- Lint CI: Biome CI check with diagnostics
Pre-push (Full - optional):
- Build & Deploy: Interactive Vercel and Sanity deployment
Verification
Test the hooks:
# Test pre-commit hook
echo "// test" >> app/page.tsx
git add app/page.tsx
git commit -m "test commit"
# Should run biome check and tsc
Notes
- Hooks run automatically on git commit/push
- Pre-commit runs only on staged files
- Build-deploy hook is interactive and requires user confirmation