
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/reactWe 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
| Metric | Tour Kit | React Joyride v3 | Shepherd.js | Driver.js | Intro.js |
|---|---|---|---|---|---|
| Bundle (gzipped) | 8.1 KB | ~34 KB | ~25 KB | ~5 KB | ~29 KB |
| Init time (median, 50 runs) | 1.8 ms | 4.2 ms | 3.6 ms | 1.2 ms | 5.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 violations | 0 | 3 | 2 | 4 | 7 |
| React 19 | ✓ | v3 only | ⚠ wrapper issues | No wrapper | ✗ |
| TypeScript | Built-in | Built-in (v3) | Built-in | Built-in | DefinitelyTyped |
| Headless mode | ✓ | ✗ | ✗ | ✗ | ✗ |
| License | MIT / Pro | MIT | MIT | MIT | AGPL v3 |
| npm weekly downloads | New | ~340K | ~130K | ~44K | Declining |
| Best for | Design system teams | Quick prototypes | Multi-framework | Element highlights | Legacy 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-motionbuilt 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:
- Sandro Roth: Evaluating tour libraries for React
- OnboardJS: 5 Best React Onboarding Libraries
- Chameleon: Top 8 React Product Tour Libraries
- Userorbit: Best Open-Source Product Tour Libraries
- Smashing Magazine: A Practical Guide To Product Tours In React Apps
- LogRocket: 7 Best Product Tour JS Libraries
- Bundle sizes via bundlephobia.com, April 2026
- npm downloads via npmjs.com, April 2026
Related articles

5 best alternatives to building onboarding in-house
Compare 5 alternatives to building product tours from scratch. See real costs, bundle sizes, and accessibility scores to pick the right onboarding approach.
Read article
8 best onboarding Chrome extensions for product teams (2026)
Compare the top onboarding Chrome extensions side by side. We tested 8 tools on pricing, accessibility, and design flexibility to help your team pick.
Read article
5 best onboarding solutions with real analytics (not vanity)
Compare 5 onboarding tools that track activation rate and feature adoption, not just tours started. Pricing, bundle size, and analytics depth reviewed.
Read article
Onboarding tools ranked by customer reviews (G2 + Capterra data)
Compare 10 onboarding tools using real G2 and Capterra ratings, review counts, and developer feedback. Pricing, complaints, and open-source options included.
Read article