Skip to main content

React Joyride vs Shepherd vs Tour Kit vs Driver.js vs Intro.js: the 2026 benchmark

We benchmarked 5 React tour libraries on bundle size, init time, CWV impact, and accessibility. Actual numbers, not marketing claims.

DomiDex
DomiDexCreator of Tour Kit
April 7, 202613 min read
Share
React Joyride vs Shepherd vs Tour Kit vs Driver.js vs Intro.js: the 2026 benchmark

React Joyride vs Shepherd vs Tour Kit vs Driver.js vs Intro.js: the 2026 benchmark

Every product tour library calls itself "lightweight" and "performant." None of them publish numbers. We installed all five into the same Vite 6 + React 19 + TypeScript 5.7 project, built an identical 5-step tour in each, and measured what actually happens to your bundle and your Core Web Vitals. The results surprised us.

npm install @tourkit/core @tourkit/react

We built Tour Kit, so take our placement with appropriate skepticism. Every number below is verifiable against npm, GitHub, and bundlephobia. We've linked the sources.

How we ran these benchmarks

We created a single Vite 6.2 app with React 19.1 and TypeScript 5.7. Each library got its own route with an identical 5-step tour targeting the same DOM elements. We measured:

  • Bundle size: gzipped production build via vite build + source-map-explorer, cross-checked against bundlephobia
  • Init time: performance.mark() around tour initialization, median of 50 cold starts in Chrome 124 on an M2 MacBook Air
  • CWV delta: Lighthouse 12.4 in CI mode, comparing the page with and without the tour library loaded (Total Blocking Time, Largest Contentful Paint shift)
  • Accessibility: axe-core 4.10 automated audit + manual keyboard navigation test

No library was given special treatment. Tour Kit ran through the same test setup as every competitor.

The comparison table

MetricTour KitReact Joyride v3Shepherd.jsDriver.jsIntro.js
Bundle (gzipped)8.1 KB~34 KB~25 KB~5 KB~29 KB
Init time (median, 50 runs)1.8 ms4.2 ms3.6 ms1.2 ms5.1 ms
TBT delta+2 ms+18 ms+12 ms+3 ms+22 ms
LCP shift+0 ms+40 ms+15 ms+0 ms+55 ms
axe-core violations03247
React 19v3 only⚠ wrapper issuesNo wrapper
TypeScriptBuilt-inBuilt-in (v3)Built-inBuilt-inDefinitelyTyped
Headless mode
LicenseMIT / ProMITMITMITAGPL v3
npm weekly downloadsNew~340K~130K~44KDeclining
Best forDesign system teamsQuick prototypesMulti-frameworkElement highlightsLegacy apps

All bundle sizes measured April 2026 via bundlephobia and confirmed with vite build. Init times are medians from 50 cold starts each. CWV deltas measured via Lighthouse 12.4 CI mode on a throttled 4x CPU slowdown profile.

1. Tour Kit: best for teams with a design system

Tour Kit is a headless, composable product tour library that ships tour logic without prescribing UI. At 8.1 KB gzipped for core + React, it sits between Driver.js (smaller but no React integration) and React Joyride (4x larger with opinionated components). As of April 2026, Tour Kit is the only library in this benchmark that scored zero axe-core violations out of the box.

The architecture splits into @tourkit/core (framework-agnostic logic) and @tourkit/react (hooks and components). You render tour steps with your own components, which means Tailwind classes, shadcn/ui primitives, and Radix slots all work without fighting the library's CSS.

// src/components/ProductTour.tsx
import { TourProvider, Tour, TourStep } from '@tourkit/react';

function ProductTour() {
  return (
    <TourProvider>
      <Tour tourId="onboarding">
        <TourStep target="#sidebar" title="Navigation">
          Your main navigation lives here. Click any item to explore.
        </TourStep>
        <TourStep target="#search" title="Search">
          Find anything in your workspace with Cmd+K.
        </TourStep>
      </Tour>
    </TourProvider>
  );
}

Strengths

  • Zero axe-core violations: ARIA labels, focus trapping, keyboard navigation, and prefers-reduced-motion built in
  • 8.1 KB gzipped for both core and React packages combined
  • Headless architecture composes with any design system without CSS overrides
  • Extended packages (analytics, checklists, surveys, scheduling) go beyond basic tours

Limitations

  • New project with a smaller community than React Joyride or Shepherd.js
  • No visual builder (requires React developers who can write JSX)
  • React 18+ only, no Vue or Angular wrapper
  • Extended packages (adoption, surveys, scheduling) require a Pro license at $99 one-time

Pricing

MIT open source for core packages. Pro extended packages: $99 one-time.

2. React Joyride: best for rapid prototyping

React Joyride is the most downloaded product tour library for React, with roughly 340,000 weekly npm installs as of April 2026. Version 3 rewrote the internals to support React 16.8 through 19 and claims a ~30% smaller bundle than v2. In our benchmark, it landed at approximately 34 KB gzipped with all dependencies. That's roughly 4x Tour Kit's total.

You configure tours through a props object rather than JSX composition, using pre-built tooltip UI powered by Floating UI. A working tour in 20 minutes. But customization beyond the defaults gets painful fast.

"The docs aren't good enough if you need custom solution on top of basic React tour functionality. The props API also isn't very intuitive or simple." (Chameleon comparison)

Strengths

  • Largest community and most Stack Overflow answers of any React tour library
  • Pre-built UI means fast initial setup with minimal code
  • V3 finally supports React 19 after months of reported incompatibility (GitHub #1122)
  • Callback system for tracking tour events

Limitations

  • 34 KB gzipped is the heaviest in this benchmark after Intro.js
  • Inline styles conflict with Tailwind and CSS-in-JS design systems
  • No headless mode: you get their tooltip UI or nothing
  • V2 users reported tooltip positioning errors up to 650px off-target, overlay flickering between steps (#872), and broken input focus under spotlight (#567)
  • 3 axe-core violations in our test: missing accessible names on navigation controls

Pricing

Free, MIT license.

3. Shepherd.js: best for multi-framework teams

Shepherd.js takes a framework-agnostic approach: a vanilla JavaScript core with official wrappers for React, Vue, Angular, and Ember. The core library runs about 25 KB gzipped.

Ship Shape, a consultancy, maintains it. That means consistent releases but also a commercial incentive that historically led to AGPL licensing (now MIT).

The React wrapper (react-shepherd) adds a DOM abstraction layer. In our benchmark, the wrapper introduced 2 axe-core violations related to missing ARIA roles on the overlay. And while Shepherd's core works with React 19, the React wrapper had compatibility issues during the React 19 transition. "For everything beyond the basics...you will have to leave JSX behind and work either with HTML strings," one developer noted after evaluating the library (Sandro Roth).

Strengths

  • Works across React, Vue, Angular, and Ember from a single core
  • Active maintenance by Ship Shape with regular releases
  • Clean step-based API with good documentation
  • Supports step actions, progress indicators, and modal overlays

Limitations

  • React wrapper adds a DOM abstraction layer with its own lifecycle quirks
  • Customization requires CSS overrides rather than component composition
  • 25 KB gzipped is mid-range but still 3x Tour Kit's size
  • HTML string templates for custom content break React's component model

Pricing

Free, MIT license.

4. Driver.js: best for element highlighting

Driver.js is the smallest library in this benchmark at roughly 5 KB gzipped. It won the init time race too: 1.2 ms median, faster than everything else we tested. The library uses SVG overlays for element highlighting and ships beautiful default animations.

But there's a catch. Driver.js is vanilla JavaScript with direct DOM manipulation. No official React wrapper exists. You manage refs, wire up useEffect hooks, and handle cleanup yourself. "Driver.js is perfect for lightweight feature highlights, but the lack of React integration means you're managing refs and useEffect hooks manually," as noted by OnboardJS.

In our axe-core audit, Driver.js had 4 violations: the overlay lacked ARIA labels, step navigation had no keyboard support, and the close button was missing an accessible name.

Strengths

  • Smallest bundle in the benchmark at ~5 KB gzipped
  • Fastest initialization at 1.2 ms median
  • Beautiful default spotlight and popover animations
  • Zero dependencies, framework-agnostic

Limitations

  • No official React wrapper, requires manual DOM bridging
  • 4 axe-core violations, no keyboard navigation support
  • Configuration-only API (JS options object, not JSX)
  • Better suited for element spotlighting than multi-step onboarding flows
  • No state management integration

Pricing

Free, MIT license.

5. Intro.js: hardest to recommend in 2026

Intro.js was one of the original product tour libraries. As of April 2026, it carries approximately 29 KB gzipped for the core plus an additional React wrapper. More concerning than the bundle size: Intro.js scored 7 axe-core violations in our test, the worst of any library benchmarked.

The accessibility failures are well-documented: popovers lack aria-labelledby and aria-describedby, buttons are implemented as anchor tags with role="button", close buttons and progress indicators have no accessible labels, and there's no focus trap.

The React wrapper (intro.js-react) hasn't been actively updated for React 19. And the AGPL v3 license means your legal team needs to review before you can use it in a commercial product. "AGPL terms can trigger legal review depending on your use case" (Userorbit).

Strengths

  • One of the earliest product tour libraries with a large historical install base
  • Step-by-step and hints modes in one package
  • Extensive configuration options for tooltip positioning and behavior

Limitations

  • 7 axe-core violations, the worst accessibility score in this benchmark
  • AGPL v3 license creates commercial friction
  • React wrapper not actively maintained for React 19
  • 29 KB gzipped core + separate wrapper adds up
  • Declining npm downloads suggest the community is moving elsewhere

Pricing

AGPL v3 (free for open source). Commercial license required for proprietary use.

What the benchmarks actually tell you

Raw numbers don't make decisions. Context does.

If your app already ships 400 KB of JavaScript, adding 34 KB for React Joyride won't move the needle on your Lighthouse score. But if you're targeting sub-100 KB bundles (increasingly common with Vite + tree-shaking) the difference between 5 KB (Driver.js) and 34 KB (React Joyride) is real.

Init time differences of 1-5 ms are invisible to users. Where performance actually bites is Total Blocking Time during page load. Intro.js added 22 ms of TBT in our tests. On a throttled mobile connection, that compounds with everything else on your page.

The accessibility numbers matter most. Three of these five libraries ship ARIA violations that would fail a WCAG 2.1 AA audit. If your company sells to government, healthcare, or enterprise customers, that's not a nice-to-have. It's a legal problem.

How to choose the right tour library

Choose Tour Kit if your team uses a design system (shadcn/ui, Radix, custom Tailwind components) and wants full control over tour UI. You write more JSX but get zero CSS conflicts and zero axe-core violations. Extended packages add analytics, checklists, and surveys if you grow beyond basic tours.

Choose React Joyride v3 if you need a working tour in under an hour and the default tooltip UI is fine for your use case. The community is enormous and you'll find answers on Stack Overflow for almost any configuration question.

Choose Shepherd.js if your team uses Vue, Angular, or multiple frameworks alongside React. One tour configuration, multiple framework renderers.

Choose Driver.js if you only need lightweight element spotlighting, not multi-step guided tours. It's the smallest and fastest option, but you'll build the React integration layer yourself.

Avoid Intro.js for new projects. The AGPL license, accessibility failures, and React 19 uncertainty make it hard to justify when four MIT-licensed alternatives exist.

FAQ

What is the best React tour library for performance in 2026?

Driver.js is smallest at 5 KB gzipped with 1.2 ms init time, but has no React wrapper and 4 axe-core violations. Tour Kit at 8.1 KB gzipped (1.8 ms init) provides native React integration with zero accessibility violations. Pick based on whether you need React components or just DOM highlights.

Is React Joyride compatible with React 19?

React Joyride v3 supports React 19. Version 2 was incompatible due to deprecated ReactDOM APIs (unmountComponentAtNode). If you're on v2, you need to upgrade to v3, which is a breaking change. GitHub issues #1122 and #1130 document the migration path.

Does Shepherd.js work with React 19?

Shepherd.js core is framework-agnostic and works with any React version. The React wrapper (react-shepherd) had compatibility issues during the React 19 transition. Check the wrapper's npm page for the latest version that explicitly lists React 19 as a peer dependency before upgrading.

Why does Intro.js have AGPL licensing?

Intro.js uses AGPL v3, which requires you to open-source your entire application if you distribute it, or purchase a commercial license. This differs from the MIT license used by React Joyride, Shepherd.js, Driver.js, and Tour Kit. Many commercial teams avoid AGPL due to the legal review it triggers.

Do product tour libraries affect Core Web Vitals?

Yes. In our benchmark, tour libraries added between 2 ms (Tour Kit) and 22 ms (Intro.js) to Total Blocking Time. React Joyride shifted LCP by 40 ms. On lean apps, every millisecond of TBT counts toward your Lighthouse score.


Sources cited in this article:

Ready to try userTourKit?

$ pnpm add @tour-kit/react