Sonner

An opinionated, animated toast notification component for React with a tiny imperative API.

Library
npm
v2.0.8
13,072 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
61 /100 Good
Development Activity 32
Maintenance 56
Community 64
Maturity 52
Momentum 40

Technical Analysis

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

Sonner is an opinionated toast component for React created by Emil Kowalski, the designer behind notification systems at Vercel and Linear. It ships a single <Toaster /> component and an imperative toast() function that can be called from anywhere in a React tree — no context provider or prop drilling required — to trigger stacked, animated, swipeable toast notifications.

Under the hood a lightweight pub-sub store decouples toast state from the render tree, and the library includes first-class support for promise-based toasts (loading to success/error), rich colors, custom themes, and Next.js App Router client components, while remaining dependency-free at runtime.

What You Get

  • A <Toaster /> component and imperative toast() API with success/error/info/warning/loading variants
  • Built-in promise handling that maps loading, success, and error states to toast content automatically
  • Swipeable, stackable toasts with configurable position, gap, duration, and expand-on-hover behavior
  • Light/dark/system theme support and a richColors mode for semantic color-coded toasts
  • Zero runtime dependencies and a single dependency-free CSS file shipped alongside the JS

Common Use Cases

  • Confirming form submissions or API mutations with success/error toasts
  • Showing progress for async operations via toast.promise() (e.g. file uploads, checkout flows)
  • Surfacing background job status (e.g. ‘Deploy started’ to ‘Deploy succeeded’) without blocking the UI
  • Replacing native browser alerts with a dismissible, accessible, theme-aware notification system

Under The Hood

Architecture Sonner is a single-package React component library centered on an observer/pub-sub pattern in src/state.ts (the Observer class) that decouples imperative toast() calls from the render tree — calling toast.success(…) publishes to a subscriber list that the mounted <Toaster /> (src/index.tsx) picks up via ToastState.subscribe inside a useEffect, batching updates with ReactDOM.flushSync and requestAnimationFrame to avoid render-thrash. The Toaster component tracks per-toast heights (HeightT[]) and an offset/gap layout system to stack toasts, groups toasts by position (top-right, bottom-center, etc.) into separate <ol> lists, and delegates each toast’s swipe/dismiss/hover/timer lifecycle to the inner Toast component, which manages its own mount/removal/animation state locally via refs and timers rather than through the global store.

Tech Stack Pure TypeScript/React library (peer deps react/react-dom ^18 || ^19) with zero runtime dependencies — styling is a single hand-authored CSS file (src/styles.css, ~17KB) shipped alongside the JS rather than CSS-in-JS. Built with bunchee (a bundler for library authors) producing dual ESM/CJS output with type declarations (dist/index.mjs, dist/index.js, dist/index.d.ts). The repo is a pnpm+Turborepo monorepo (pnpm-workspace.yaml, turbo.json) housing the library alongside a docs website package; testing uses Playwright for e2e browser tests rather than a unit-test runner.

Code Quality Test coverage is a single Playwright e2e spec (test/tests/basic.spec.ts, 340 lines) driving the built Toaster in a real browser (opening, dismissing, swiping toasts) — there are no unit tests for state.ts’s Observer class or types. Source is fully typed (types.ts defines roughly 200 lines of exported interfaces: ToastT, ToasterProps, ToastClassnames, etc.), naming is consistent and descriptive, and error handling in state.ts’s promise() method carefully branches on Response/Error/plain-value results, with a try/catch fallback for older Safari’s matchMedia API (addListener) in index.tsx. index.tsx is a large (889-line) single file mixing the Toast and Toaster components plus utility functions, which increases the surface a contributor needs to hold in their head.

API Design The public API is minimal and idiomatic — a single <Toaster /> mounted once plus an imperative toast() function (and toast.success/error/info/warning/loading/promise/custom/dismiss) callable from anywhere in the tree without hooks or context providers, which the README demonstrates in under 10 lines. Object.assign is used to attach the typed sub-methods onto the base toast function, preserving full TypeScript intellisense. The promise() API elegantly maps loading/success/error states to toast content, including HTTP Response detection. Minor DX friction: dedicated getting-started docs live outside the repo (hosted at sonner.emilkowal.ski), and the ‘use client’ directive at the top of index.tsx/assets.tsx signals Next.js App Router awareness without being called out in the README.

Used by 117 apps in this directory

TypeScript
83%
MIT

page-agent

AI Agents · Automation

29,560

Control any web interface with natural language — no browser extension, no headless browser, just a JavaScript script tag.

View details
78
Repo Health
83
Technical
82
Dependency
Built with
TypeScript 83%
JavaScript 12%
Updated 1 weeks ago
TypeScript
82%
Apache 2.0

Palmr.

File Storage · Security

2,395

Self-hosted, privacy-focused file sharing without limits

View details
57
Repo Health
62
Technical
68
Dependency
Built with
TypeScript 82%
MDX 13%
Updated 2 weeks ago
TypeScript
99%
Other

Papermark

Digital Signiture · File Storage

9,263

Open-source DocSend alternative with page-by-page analytics, secure data rooms, and custom domains for document sharing.

View details
78
Repo Health
63
Technical
66
Dependency
Built with
TypeScript 99%
Updated 2 months ago
TypeScript
96%
MIT

Payload CMS

Blogging · CMS · Developer Tools

45,458

The open-source, Next.js-native headless CMS that lives inside your /app folder and gives you a full TypeScript backend instantly.

View details
92
Repo Health
88
Technical
65
Dependency
Built with
TypeScript 96%
Updated 6 days ago
TypeScript
95%
AGPL 3.0

Rallly

Scheduling

5,318

Self-hostable group scheduling polls that eliminate back-and-forth emails and find the best meeting time for everyone.

View details
91
Repo Health
75
Technical
66
Dependency
Built with
TypeScript 95%
Updated 1 weeks ago
TypeScript
83%
AGPL 3.0

Recordly

Design Tools · Developer Tools · Productivity

34,929

Free, open-source screen recorder and editor for macOS, Windows, and Linux that auto-adds zooms, cursor polish, webcam overlays, and styled frames to your screen captures without any motion-design skills.

View details
84
Repo Health
82
Technical
70
Dependency
Built with
TypeScript 83%
Updated 6 days ago
Rust
72%
Apache 2.0

Rivet

AI Agents · Developer Tools

6,326

Stateful actors as a primitive for AI agents, real-time collaboration, and durable execution — with in-memory state, WebSockets, queues, and scheduling built in.

View details
87
Repo Health
81
Technical
64
Dependency
Built with
Rust 72%
TypeScript 25%
Updated 6 days ago
TypeScript
98%
Apache 2.0

rowboat

AI Assistants · AI Development

18,060

Build, test, and deploy multi-agent AI workflows with a visual editor, RAG data sources, MCP tool integration, and a production-ready REST API.

View details
88
Repo Health
72
Technical
65
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
99%
MIT

Rudel

Developer Tools

306

Open-source analytics for Claude Code and Codex sessions — a CLI uploads session transcripts to a self-hostable dashboard tracking token usage, session duration, activity patterns, and model usage.

View details
75
Repo Health
67
Technical
71
Dependency
Built with
TypeScript 99%
Updated 2 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