Embla Carousel React

A lightweight, dependency-free React hook for building fluid, touch-precise carousels and sliders.

Library
npm
v8.6.0
8,390stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum.How we score it →
83/100Excellent
Development Activity84
Maintenance92
Community56
Maturity60
Momentum40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation.How we score it →
83/100Excellent
Architecture88
Code Quality82
Innovation84
Learning Curve78

Embla Carousel React is the official React binding for Embla Carousel, a framework-agnostic carousel engine built for smooth motion and precise swipe/drag handling. It exposes a single hook, useEmblaCarousel, that wires a plain DOM ref up to Embla’s vanilla-JS engine and hands back an imperative API for navigation, snap points, and events, while leaving all markup and styling entirely to the developer.

Because the engine itself has zero dependencies and does the heavy lifting outside React’s render cycle, the React wrapper stays tiny and avoids re-render thrashing during drag and scroll. It supports SSR out of the box, ships full TypeScript types, and is extensible through the same plugin system used by every other Embla framework binding (autoplay, auto-scroll, class names, fade, wheel gestures, and more).

What You Get

  • A single useEmblaCarousel hook returning a root ref, a client-side carousel API, and an SSR-safe server API for the first render
  • Automatic re-initialization when options or plugins change between renders, diffed via areOptionsEqual/arePluginsEqual to avoid unnecessary engine restarts
  • Full TypeScript types for options, plugins, and the returned EmblaCarouselType API
  • Compatibility with every official Embla plugin (Autoplay, AutoScroll, AutoHeight, ClassNames, Fade, WheelGestures, Accessibility) via the same plugins array
  • Zero imposed markup or styling — you build the slide DOM and CSS yourself, matching the library’s ‘unopinionated engine’ philosophy
  • SSR/SSG support through a dedicated server-rendered fallback API so carousels don’t flash unstyled content in frameworks like Next.js or Astro

Common Use Cases

  • Image and product galleries or hero sliders on marketing and e-commerce pages
  • Testimonial, logo, or card carousels that need touch/swipe precision on mobile
  • Multi-slide ‘peek’ layouts (e.g. showing 1.2 or 2.5 slides) using scroll-snap-driven alignment options
  • Tabbed or stepper-like interfaces built on top of Embla’s goTo/scrollTo navigation API
  • Carousels composed with shadcn/ui’s Carousel component, which is itself built directly on embla-carousel-react

Under The Hood

Architecture The hook (useEmblaCarousel, 81 lines) wraps the EmblaCarousel() factory from the sibling embla-carousel core package (a 298-line EmblaCarousel.ts orchestrating ~39 internal modules: Engine, DragHandler, ScrollBody, Translate, ResizeHandler, SlidesInView, etc.) using useRef/useState/useEffect. On first render it synchronously builds an SSR-safe ‘server’ API via EmblaCarousel(null, options, plugins); once the returned ref callback attaches to a real DOM node, a useEffect creates the live client engine and destroys it on cleanup. Options and plugins are held in refs and diffed each render with areOptionsEqual/arePluginsEqual (from embla-carousel-reactive-utils) so reInit() only fires when they actually change — all drag/scroll/animation work happens outside React’s render cycle, so it never triggers React re-renders.

Tech Stack TypeScript throughout (roughly 73% of the monorepo’s bytes), managed as a Yarn workspaces monorepo with 19 packages — one binding per framework (React, Vue, Svelte, Solid) plus official plugins (Autoplay, AutoScroll, AutoHeight, ClassNames, Fade, SSR, Accessibility) and a shared reactive-utils package. Builds run through Rollup, emitting UMD, CJS, and ESM bundles with generated .d.ts files. The React package has no runtime dependencies beyond embla-carousel and embla-carousel-reactive-utils, and declares react only as a peerDependency (^16.8 through 19.x). A separate Next.js docs site is checked into the same repo.

Code Quality The React wrapper ships no dedicated test suite of its own (its package.json test script is a no-op placeholder), but the core embla-carousel package carries 37 test files exercising engine internals (Engine, ScrollBody, DragHandler, Alignment, and more), and embla-carousel-reactive-utils has its own tests for the equality checks the hook relies on directly. ESLint and Prettier are enforced repo-wide through a shared workspace script, and the hook’s own source stays small (81 lines) with narrowly scoped, well-named type exports (UseEmblaCarouselType, EmblaRootNodeRefType).

API Design The public surface is deliberately minimal: one default export, useEmblaCarousel(options?, plugins?), returning a 3-tuple [ref, api | undefined, serverApi]. That client API being undefined until mount is the main ergonomic wrinkle — consumers must guard for it on first render, which is the most common source of friction in issues and examples. Otherwise the returned EmblaCarouselType mirrors the vanilla engine’s method names one-to-one (scrollNext, scrollPrev, scrollTo, selectedScrollSnap, on/off), so existing Embla knowledge transfers directly, and the extensive docs site (api/guides/examples/plugins sections) keeps the overall learning curve low.

Used by 46 apps in this directory

TypeScript
99%
Other

Activepieces

Automation · AI Assistants

23,887

Open-source AI automation platform that converts 280+ workflow integrations into MCP servers for LLMs, with no-code builders and TypeScript extensibility.

View details
92
Repo Health
85
Technical
65
Dependency
Built with
TypeScript99%
Updated today
TypeScript
88%
Other

AFFiNE

Productivity · Project Management · Note Taking

71,668

Write, draw, and plan in one infinite canvas — the open-source alternative to Notion and Miro that keeps your data yours.

View details
91
Repo Health
87
Technical
68
Dependency
Built with
TypeScript88%
Updated today
TypeScript
59%
Other

agenta

Developer Tools · Devops · AI Development

4,489

The open-source LLMOps platform unifying prompt engineering, evaluation, and observability for teams building reliable LLM applications.

View details
91
Repo Health
77
Technical
67
Dependency
Built with
TypeScript59%
Python39%
Updated today
TypeScript
84%
MIT

Amical

Note Taking · AI Assistants

1,495

Local-first AI dictation that understands your active app — private, offline, and built for speed.

View details
79
Repo Health
82
Technical
67
Dependency
Built with
TypeScript84%
Updated 3 weeks ago
TypeScript
51%
MIT

Anarlog

Note Taking · AI Assistants · Productivity

9,087

Anarlog is an open-source, local-first AI meeting notetaker that records, transcribes, and summarizes meetings entirely on your device — no cloud lock-in, no mandatory account, and every note saved as a plain markdown file you own forever.

View details
86
Repo Health
77
Technical
69
Dependency
Built with
TypeScript51%
Rust38%
Updated today
Python
68%
Other

AutoGPT

Automation · Productivity · AI Assistants

186,687

Build, deploy, and run autonomous AI agents that automate complex multi-step workflows using a visual block-based graph editor.

View details
93
Repo Health
78
Technical
67
Dependency
Built with
Python68%
TypeScript31%
Updated today
TypeScript
100%
AGPL 3.0

BaseBuddy

CMS

7

A self-hosted content editor for existing Postgres or Supabase schemas — maps the tables you already have into a WordPress-like TipTap editor instead of requiring you to reshape your database around a CMS.

View details
46
Repo Health
64
Technical
76
Dependency
Built with
TypeScript100%
Updated 1 weeks ago
TypeScript
49%
AGPL 3.0

BrowserOS

Browser · AI Assistants

13,248

The open-source agentic Chromium browser with native AI agents, MCP server, and visual workflow automation — your data never leaves your machine.

View details
87
Repo Health
82
Technical
69
Dependency
Built with
TypeScript49%
Rust22%
Python16%
Updated today
TypeScript
97%
Apache 2.0

Cline

AI Code Assistants

66,453

An open-source AI coding agent that lives in your editor and terminal — reads and edits your codebase, runs commands, browses the web, and requires human approval for every action by default.

View details
90
Repo Health
74
Technical
67
Dependency
Built with
TypeScript97%
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

Search