lint-staged

Run linters and formatters only against the files staged in git, so a slow full-project lint never blocks a commit.

Tool
npm
v17.6.0
14,743 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
88 /100 Excellent
Development Activity 92
Maintenance 96
Community 64
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
81 /100 Excellent
Architecture 88
Code Quality 92
Innovation 72
Learning Curve 70

lint-staged is a small CLI that filters git’s staged files through glob patterns and runs whatever formatters, linters, or scripts you configure against just that subset, instead of the whole repository. It’s almost always wired into a pre-commit git hook (commonly via Husky) so that every commit is automatically checked or auto-fixed before it lands in history.

What sets it apart from a naive “run eslint on changed files” script is its git-state safety net: before running any task it creates a git stash backup of the working tree, can hide unstaged or partially-staged hunks so auto-fixing tasks never touch code that wasn’t actually staged, then re-stages only the files the tasks modified and restores everything else exactly as it was. If a task fails or reverts staged changes entirely, lint-staged can roll the working tree back to its original state.

Configuration is a simple glob-to-command map (in package.json, a lintstagedrc file, or a JS/YAML config), supports running multiple commands in sequence per glob, plain JS functions as tasks, and multiple independent configs across monorepo packages.

What You Get

  • Glob-to-command configuration mapping staged file patterns to shell commands or JS functions
  • Automatic git stash backup before running tasks, with restore-on-failure
  • Partial-stage awareness that hides unstaged hunks so auto-fixers only touch staged content
  • Support for running multiple sequential commands per glob pattern
  • Monorepo support via multiple independent lint-staged configs grouped by directory
  • A programmatic Node.js API (in addition to the CLI) for custom tooling integrations

Common Use Cases

  • Running Prettier and ESLint automatically on every git commit via a pre-commit hook
  • Enforcing stylelint or oxlint checks only on the CSS/JS files actually being committed
  • Blocking commits that fail type-checking or tests on the changed files
  • Auto-fixing formatting issues without reformatting untouched parts of the repository
  • Running independent lint configurations per package in a JS monorepo

Under The Hood

Architecture Execution starts in bin/lint-staged.js, which parses CLI flags and calls lib/index.js’s default export; that function validates options then hands off to runAll.js, which is the real orchestrator. runAll resolves the git repo root (resolveGitRepo.js), fetches staged files (getStagedFiles.js) and any lint-staged configs (searchConfigs.js) in parallel, groups matched files by which config governs them (groupFilesByConfig.js), and expands each config into concrete tasks via generateTasks.js (glob matching lives in matchFiles.js/picomatch). Each task is either a plain function (getFunctionTask.js) or a spawned child process (getSpawnedTask.js/getSpawnedTasks.js), all wired to a shared AbortController so a failure or Ctrl+C can cancel every in-flight task. All git-state mutation — creating the backup stash, hiding partially staged hunks, updating the index after tasks run, and restoring unstaged/untracked files or the original state on error — is centralized in a single GitWorkflow class (gitWorkflow.js), keeping git plumbing cleanly separated from task-execution and glob-matching logic; nearly every later step depends on the ctx state GitWorkflow maintains, so that class is the one abstraction the rest of the pipeline can’t function without.

Tech Stack A modern ESM-only Node package (“type”: “module”, requires Node >=22.22.1) with no TypeScript compilation step — instead it ships hand-authored .d.ts declaration files alongside plain JS, checked via tsc in a typecheck script. Runtime dependencies are deliberately minimal: picomatch for glob matching, string-argv for parsing shell-style argument strings, tinyexec for lightweight child-process spawning, and an optional yaml dependency for YAML-based config files. Tooling leans on the Rust-based oxlint/oxfmt pair instead of ESLint/Prettier, vitest with istanbul coverage for testing, and changesets for release versioning, with GitHub Actions running dedicated release, security, npm-publish, and pull-request workflows.

Code Quality The test suite is extensive and layered: 41 unit test files, 39 integration test files exercising real git repositories, and 7 end-to-end tests, plus shared utils and types directories, all run through vitest. Errors are modeled as typed Symbol tags (symbols.js: ConfigNotFoundError, GitError, IntentToAddError, and others) accumulated in a ctx.errors Set and mapped to dedicated message formatters, giving callers structured, matchable failure modes rather than generic thrown strings. Naming is consistently camelCase with one exported concern per file, type safety comes from JSDoc annotations checked by tsc, and both linting (oxlint) and formatting (oxfmt) run in CI alongside the test suite on every pull request.

What Makes It Unique The distinguishing technical choice is how carefully it handles partial git staging: rather than assuming staged and working-tree content match, it can hide unstaged hunks before running auto-fixing tasks and then surgically restore only what wasn’t touched, backed by a git stash checkpoint it can roll back to on any failure. Configurable function-based tasks and per-directory config grouping for monorepos extend this further. The category of tool (“lint only what’s staged”) isn’t new, but the depth of its safety net around auto-fixing and partial staging is more careful than typical alternatives in this space.

Used by 120 apps in this directory

TypeScript
44%
Other

Magic

AI Agents · Automation · Low Code Platforms

5,048

Magic is an enterprise-grade open-source AI agent platform combining a generalist AI agent, workflow engine, IM, and collaborative office system for running an AI-powered digital workforce.

View details
69
Repo Health
79
Technical
65
Dependency
Built with
TypeScript 44%
PHP 32%
Updated 1 months ago
TypeScript
80%
AGPL 3.0

massCode

Code Editors · Developer Tools · Productivity

7,056

A free, local-first developer workspace unifying snippets, notes, HTTP requests, calculations, drawings, and dev tools in one desktop app.

View details
86
Repo Health
87
Technical
62
Dependency
Built with
TypeScript 80%
Vue 18%
Updated 2 days ago
Ruby
59%
AGPL 3.0

Mastodon

Social Media

50,367

Run your own federated social network on the open ActivityPub standard with no ads, no algorithms, and no corporate control over your community.

View details
95
Repo Health
81
Technical
70
Dependency
Built with
Ruby 59%
TypeScript 24%
Updated today
TypeScript
99%
Apache 2.0

Mastra Code

AI Code Assistants

28,674

"A coding agent that never compacts" — a terminal-based AI coding agent built on the Mastra framework, with Observational Memory instead of context compaction, multi-model support, and OAuth login for Claude Max or ChatGPT Plus.

View details
90
Repo Health
73
Technical
65
Dependency
Built with
TypeScript 99%
Updated today
TypeScript
88%
MIT

medusa

Ecommerce

36,675

The most flexible open-source commerce platform — build B2C, B2B, and marketplace applications with modular, composable commerce primitives.

View details
94
Repo Health
87
Technical
63
Dependency
Built with
TypeScript 88%
JavaScript 12%
Updated yesterday
TypeScript
44%
MIT

MentraOS

AI Development · Developer Tools

2,381

The open source operating system and SDK that lets developers build one app and run it across smart glasses from Even Realities, Vuzix, Mentra Live, and more.

View details
92
Repo Health
77
Technical
66
Dependency
Built with
TypeScript 44%
Java 20%
Kotlin 12%
Updated today
Clojure
57%
Other

Metabase

Analytics

49,597

The open-source BI platform that lets anyone ask questions and build dashboards without writing SQL — with an embedded analytics SDK and AI-powered query assistant included.

View details
95
Repo Health
84
Technical
64
Dependency
Built with
Clojure 57%
TypeScript 38%
Updated today
TypeScript
88%
MIT

Mistle

AI Agents · Developer Tools

94

Self-hostable platform for running autonomous coding agents in isolated, credentialless sandboxes with brokered credentials, reusable snapshots, and event-driven triggers.

View details
54
Repo Health
76
Technical
70
Dependency
Built with
TypeScript 88%
Rust 11%
Updated 1 weeks ago
TypeScript
97%
Other

nango

Authentication · Automation · Developer Tools

12,585

Build product integrations with AI using 800+ APIs — auth, proxy, and TypeScript functions on production-grade infrastructure.

View details
94
Repo Health
85
Technical
67
Dependency
Built with
TypeScript 97%
Updated today

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers