Library / SDK
FormidableLabs/nuka-carousel avatar
FormidableLabs/nuka-carousel

nuka-carousel: an accessibility-first React carousel you configure, not style

Small, fast, and accessibility-first React carousel library with an easily customizable UI and behavior to fit your brand and site.

3,096 stars589 forksTypeScriptNOASSERTION

At a glance

What is it?
Nuka Carousel is a TypeScript React carousel library from Nearform that ships its own UI and exposes behavior through props. Here is how it installs, what the repository layout implies about its maintenance, and where it stops being the right choice.
Who is it for?
Adopt nuka-carousel if you want a React carousel whose controls, spacing and behavior are driven by props and you are willing to accept the library's own default UI as the starting point. Do not adopt it if you need a headless primitive that renders nothing until you compose every element yourself; Embla Carousel is the closer fit there.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 177 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 1, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem nuka-carousel solves for React teams

Building a carousel from scratch is mostly a list of edge cases: keyboard focus order, which slide is announced to a screen reader, what happens when the viewport is narrower than one slide, and how the previous and next controls behave at the ends of the list. Nuka Carousel exists so a React team does not have to solve those cases again. The README describes it as a "small, fast and accessibility-first React carousel library with easily customizable UI and behavior to fit your brand and site." That sentence carries the design intent: the library ships a working carousel, and customization happens through the API rather than by rebuilding the component.

The audience is narrow and specific. This is for React applications that need a slider on a marketing page, a product gallery or a content rail, written in TypeScript, where the team would rather pass props than own the focus management. It is not a general purpose animation library, and the repository gives no indication that it targets non-React frameworks. If your site is not React, the package has nothing for you.

How the package is structured, and what the layout implies

The repository is a pnpm workspace. The root package.json is named nuka-carousel-monorepo and its scripts delegate into a filtered package: build runs pnpm run --filter nuka-carousel build, test runs pnpm run --filter nuka-carousel test, and the Storybook and website scripts follow the same pattern. That means the published library lives under packages/, while docs/ and website/ hold the documentation site and its source. The README points at the docs folder directly, saying the source for the docs site lives in this repo.

Two consequences follow. First, the README is a landing page, not a manual. It gives one install command and a link to the docs site; anything about props, slide behavior or accessibility specifics has to come from the docs folder or the live demo. Second, because the library is a filtered workspace package, the root package.json is not the artifact you install. Reading it to learn the public API will not work.

The monorepo also tells you something about release discipline. A .changeset directory sits at the top level and the root scripts include changeset and a version script that runs pnpm changeset version && pnpm install --no-frozen-lockfile, which is the standard Changesets workflow. Versions are cut deliberately rather than on every push.

Installing nuka-carousel and rendering a first carousel

The README gives exactly one install instruction: run the following command in your project folder.

bash
yarn add nuka-carousel

After that the README sends you to the docs site for a live demo. It does not include a usage snippet, so the component name and prop names are not documented in the README itself. The package name you import is nuka-carousel, matching the published package, and the repository is TypeScript, so type definitions ship with it. Everything beyond the import has to be read from the docs folder or the Storybook stories in the repository.

bash
yarn add nuka-carousel

If your project uses npm rather than yarn, the equivalent install is npm install nuka-carousel; the README only shows the yarn form. There is no CLI, no configuration file and no build step for consumers. You add the dependency, import the component, and pass slides as children. Because the README does not show the import line or a props example, treat the docs site as the required second step rather than an optional one.

Customization is the API, and that is also the constraint

The phrase "easily customizable UI and behavior" in the README describes the library's central trade-off. Nuka Carousel is not headless. It renders its own controls, its own slide container and its own transitions, and you adjust them through props. That is a real advantage when you want a carousel that looks reasonable on day one and you are willing to accept the library's defaults as the base. It is a real cost when your design system already owns every interactive element and you need the carousel to emit nothing but structure.

The repository layout supports this reading. There is a Storybook setup with a test runner, and the root scripts include start:storybook, build:storybook, test:storybook, start:website and build:website. Stories are the place where the team demonstrates variants, which is consistent with a component that has many configurable states rather than a small primitive. If you are evaluating the library, the stories are a better signal of what is configurable than the README, which mentions no props at all.

Where nuka-carousel is the wrong tool

The clearest limitation is documentation depth at the entry point. The README gives one install command and a link. It does not document the props, the slide-count behavior, the control rendering, server-side rendering behavior, or what happens under reduced-motion preferences. The repository does not include a CHANGELOG.md at the top level either; release history is expressed through Changesets and the published release notes. If your team needs to justify a dependency from its README alone, this one will not carry that weight.

A second boundary is scope. This is a carousel, not a general slider or a virtualized list. If you need to render thousands of items with windowing, a carousel component is the wrong abstraction regardless of which one you pick. And if your application is not React, the package is irrelevant, since the README and the repository describe a React component in TypeScript with no indication of framework-agnostic builds.

Finally, maintenance status should be read from the facts rather than the badge. The README carries a maintenance badge reading "Active" and states that Nearform is actively working on the project. The repository is not archived, and the last push was on 2026-04-07. The most recent release listed is [email protected] from 2025-01-27. Those two dates are roughly a year apart, which is worth noting if your project depends on a fast release cadence.

Embla Carousel and the difference in approach

Embla Carousel appears directly in the search phrases people use around this project, and the comparison is the useful one. Embla is a headless carousel: it manages the scrolling engine and exposes state, and the markup, controls and styling are yours to build. Nuka Carousel takes the opposite position. It renders a complete carousel with its own UI and lets you adjust that UI through props.

The practical difference shows up on the first day of integration. With a headless library you write the previous and next buttons, the dot indicators and the container markup before anything appears on screen, and in exchange you get exact control over semantics and styling. With nuka-carousel you get a working carousel immediately and then work within its prop surface. Neither is better in the abstract; the choice depends on whether your design system or the library owns the interactive elements. If your team already has accessible button and roving-focus patterns, a headless engine avoids duplicating them. If not, nuka-carousel's defaults save you that work.

Licence, upgrades and what to verify before adopting

The repository carries a LICENSE file at the top level, but the metadata describes the licence as NOASSERTION, meaning it could not be automatically matched to a standard identifier. Do not assume MIT or Apache-2.0 from the project's history. Open the LICENSE file in the repository and read it before you ship, and route anything unclear to whoever handles licensing on your team. This article is not legal advice.

Upgrade cost is shaped by the Changesets workflow. Releases are versioned deliberately, and the release history listed here shows 8.1.0 and 8.1.1 within a day of each other in October 2024, then 8.2.0 in January 2025. That is a patch-heavy pattern rather than a stream of breaking changes, but there is no CHANGELOG.md in the repository root to scan for breaking changes, so you will read the release notes on the package page. Because the library renders its own UI, a minor release that adjusts markup or class names can affect your visual overrides even when the API is unchanged. Pin the version in your lockfile and read the release notes before bumping.

What to verify first: install [email protected], render a carousel with several slides, and tab through it with a screen reader running. The README calls the library accessibility-first, but it does not describe the keyboard or announcement behavior, so the claim needs your own check rather than the project's.

Editorial conclusion

Adopt nuka-carousel if you want a React carousel whose controls, spacing and behavior are driven by props and you are willing to accept the library's own default UI as the starting point. Do not adopt it if you need a headless primitive that renders nothing until you compose every element yourself; Embla Carousel is the closer fit there. Before committing, install [email protected], render a carousel with three or more slides, and check the rendered output against your keyboard and screen-reader requirements, because the README does not document the accessibility contract in detail. Then read the docs folder in the repository rather than the README, which is thin.

Frequently asked questions

What are the different types of carousels?

The repository does not classify carousel types. What it does describe is nuka-carousel itself, a React carousel library whose UI and behavior are configured to fit a brand and site, with a Storybook setup in the repository for demonstrating variants.

What does "carousel" mean in coding?

In this repository the term refers to a React component that presents slides, published as the nuka-carousel package. The README describes it as small, fast and accessibility-first, with customizable UI and behavior.

What is the purpose of the React carousel component?

For nuka-carousel, the purpose is to give React applications a carousel whose UI and behavior fit the site, rather than one the team builds from scratch. The README positions it as accessibility-first and points to a docs site for a live demo.

What is a carousel effect?

The repository does not define the term. The closest thing it offers is the animated example image in the README and the docs site demo, which show the library's slide transitions rather than describing them in prose.

Official sources

  1. FormidableLabs/nuka-carousel on GitHub
  2. Issues
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/formidablelabs-nuka-carousel.svg)](https://hysenlabs.com/projects/formidablelabs-nuka-carousel)