clsx

A tiny, fast utility for conditionally constructing className strings

Library
npm
v2.1.1
9,844 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
42 /100 Fair
Development Activity 0
Maintenance 20
Community 48
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
77 /100 Good
Architecture 68
Code Quality 78
Innovation 88
Learning Curve 85

clsx is a tiny (239 bytes gzipped) JavaScript utility for building className strings from a mix of strings, objects, arrays, and conditional expressions. It skips falsy values automatically, so developers can write clsx('btn', isActive && 'active', { disabled }) instead of chaining ternaries or template literals by hand.

Written by Luke Edwards as a faster, smaller drop-in replacement for the popular classnames package, clsx ships as ESM, CommonJS, and UMD builds with zero dependencies. A clsx/lite variant trims the API to string-only inputs for an even smaller footprint, and both versions are commonly paired with Tailwind CSS for conditional utility-class composition in React, Vue, Svelte, and other component frameworks.

What You Get

  • A single default export function (clsx(...inputs)) that accepts strings, numbers, objects, arrays, and nested combinations of all four
  • A clsx/lite entry point for string-only concatenation at an even smaller bundle size (140B gzipped)
  • Prebuilt ESM (dist/clsx.mjs), CommonJS (dist/clsx.js), and UMD (dist/clsx.min.js) bundles with matching TypeScript declarations
  • Zero runtime dependencies and broad compatibility down to Node 6 and IE9+ browsers

Common Use Cases

  • Toggling CSS classes based on component state, e.g. clsx('btn', { active: isActive, disabled: isDisabled })
  • Composing Tailwind CSS utility classes conditionally across React, Vue, and Svelte components
  • Merging a base class list with a className prop passed down from a parent component
  • Replacing verbose ternary or template-literal string concatenation for dynamic class names

Under The Hood

Architecture clsx is a single-file micro-library. src/index.js implements two functions: an internal recursive toVal(mix) that stringifies a single input (handling string/number, array via recursion, or object via a for...in over truthy keys), and the exported clsx(...arguments), which iterates variadic arguments, calls toVal on each truthy one, and joins the non-empty results with spaces. The lite variant (src/lite.js) drops object/array support entirely, keeping only a straight string-concatenation loop for a smaller build. The bin/index.js build script compiles both entry files into ESM, CommonJS, and minified UMD bundles under dist/, with a single ambient .d.ts/.d.mts pair shared across entry points via package.json’s exports conditions. There is no internal module graph beyond this — the runtime is well under 50 lines of code, and the package’s real “architecture” is its build/export surface (three module formats times two variants) rather than any internal layering.

Tech Stack Written in plain, ES5-compatible JavaScript with no runtime dependencies — package.json devDependencies are build/test-only (esm, terser for minification, uvu as the test runner). Types are hand-written ambient .d.ts/.d.mts files rather than generated from source, and builds are produced by a custom bin/index.js script rather than a bundler like Rollup or esbuild. The exports map targets both import and default (CJS) conditions per entry point (. and ./lite), and engines declares Node >=6 compatibility, reflecting a design goal of maximal compatibility over modern tooling.

Code Quality Tests live in test/index.js and test/lite.js using uvu + uvu/assert, covering strings, numbers, objects, arrays (including deep nesting), and edge cases like objects with push/pop keys or function arguments being ignored — a thorough suite for such a small surface area. test/classnames.js appears to benchmark parity against the classnames package it replaces. There is no TypeScript source (JS only, with a separate hand-maintained .d.ts), minimal inline comments, and terse variable naming (k, y, x, tmp) typical of size-optimized micro-libraries; readability is traded for byte count, but the logic is simple enough that this doesn’t hurt maintainability.

API Design The public API is a single variadic function accepting any mix of strings, numbers, objects, arrays, and falsy values, mirroring — and beating on file size — the popular classnames package it was designed to replace, meaning near-zero migration cost for existing users. Both a default and named clsx export are provided for import ergonomics, and the clsx/lite subpath export lets consumers opt into a smaller, string-only build without changing call sites elsewhere. The README is concise and example-driven, with runnable snippets ready to copy-paste. No configuration or setup step is required; the package is usable correctly from the first line of code.

Used by 257 apps in this directory

Rust
47%
Apache 2.0

magika

Developer Tools · Security

18,679

AI-powered file type detection that identifies 200+ content types with ~99% accuracy in milliseconds using a compact deep learning model.

View details
84
Repo Health
85
Technical
73
Dependency
Built with
Rust 47%
YARA 16%
Python 12%
Updated 2 weeks ago
Rust
56%
Apache 2.0

Magnitude

AI Development · Developer Tools

5,285

An open source inference engine that profiles your hardware, recommends the best local models, and tunes them for the coding agent you already use.

View details
78
Repo Health
83
Technical
71
Dependency
Built with
Rust 56%
TypeScript 18%
Python 11%
Updated 1 weeks ago
TypeScript
92%
Apache 2.0

Apache Maka

AI Agents · AI Development · Developer Tools

5,668

An Apache-incubated agent workspace that treats every model call, tool run, and permission decision as an append-only, replayable event log instead of disposable chat history.

View details
81
Repo Health
85
Technical
81
Dependency
Built with
TypeScript 92%
Updated 1 weeks ago
TypeScript
99%
AGPL 3.0

Manage

Collaboration · Project Management

71

Self-hosted, open-source project management with tasks, calendars, docs, and real-time team collaboration.

View details
39
Repo Health
57
Technical
71
Dependency
Built with
TypeScript 99%
Updated 2 months ago
Python
62%
Apache 2.0

marimo

Data Engineering · Developer Tools

22,918

A reactive Python notebook that eliminates hidden state, runs reproducibly, and deploys as a web app or script — stored as pure Python, built for the AI era.

View details
89
Repo Health
91
Technical
65
Dependency
Built with
Python 62%
TypeScript 37%
Updated 1 weeks ago
JavaScript
98%
Other

Markdrop

Note Taking

361

Visual drag-and-drop markdown editor with GitHub-specific blocks, cloud sync, and offline PWA support

View details
37
Repo Health
57
Technical
69
Dependency
Built with
JavaScript 98%
Updated 6 months ago
TypeScript
80%
AGPL 3.0

massCode

Code Editors · Developer Tools · Productivity

7,003

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

View details
87
Repo Health
87
Technical
63
Dependency
Built with
TypeScript 80%
Vue 19%
Updated 1 weeks ago
TypeScript
99%
Apache 2.0

Mastra Code

AI Code Assistants

28,378

"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 1 weeks ago
TypeScript
51%
Other

Mattermost

Collaboration · Devops · Team Chat

39,203

Open core, self-hosted team collaboration with chat, AI agents, voice calling, and deep DevOps integrations — all under your control.

View details
96
Repo Health
87
Technical
65
Dependency
Built with
TypeScript 51%
Go 40%
Updated 1 weeks ago

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