Skip to main content

What is the best shadcn/ui compatible tour library?

Compare 7 tour libraries for shadcn/ui compatibility. See bundle sizes, headless support, and Tailwind integration to pick the right fit.

DomiDex
DomiDexCreator of Tour Kit
April 10, 20266 min read
Share
What is the best shadcn/ui compatible tour library?

What is the best shadcn/ui compatible tour library?

shadcn/ui has 75,000+ GitHub stars, yet it ships without a Tour component. Issue #999 requested one in July 2023, collected 21+ upvotes, and was closed without a merge. The underlying layer, Radix UI, has the same gap: Discussion #1199 from February 2022 asked for a tour primitive. A Radix maintainer explained why it never shipped: "It seems this pattern altogether would need quite a bit of research to see how it can be made accessible seeing that it needs to 'isolate' portions of the rendered page rather than separate modal content."

So you need a third-party library. The question is which one actually works with your existing shadcn/ui Card, Button, and Popover components without fighting your Tailwind theme.

npm install @tourkit/core @tourkit/react

Short answer

Tour Kit is the best shadcn/ui compatible tour library as of April 2026. It ships a headless core under 8KB gzipped that handles step sequencing, element highlighting, focus management, and keyboard navigation while you render tour steps with your own shadcn/ui components. No imported CSS, no style overrides, no !important hacks.

Other libraries like React Joyride, Driver.js, and Shepherd.js all ship their own styling systems that conflict with Tailwind's utility-first approach. Matching your shadcn theme means CSS overrides. Tour Kit was built specifically for this stack. (We built it, so take this with appropriate skepticism. Every claim below is verifiable against npm, GitHub, and bundlephobia.)

How tour libraries handle styling (the real compatibility test)

The core tension is simple. shadcn/ui follows a copy-paste-own philosophy: you get the source code, style it with Tailwind, and it becomes part of your project. As one developer put it, "The ownership model (copy, don't install) solves the two biggest problems with component libraries: upgrade hell and customization friction" (DEV Community, 2026).

Most tour libraries take the opposite approach. They ship pre-built tooltips with their own CSS that you then override. That means your tour looks different from the rest of your app until you spend hours fighting specificity.

Three architecture patterns exist in the wild:

  1. Own-CSS libraries (React Joyride, Shepherd.js, Intro.js, Driver.js) ship stylesheets you must import. Tailwind classes can't replace their internal styles without !important or deep selector overrides.

  2. shadcn-styled wrappers (shadcn/tour, Onborda, AllShadcn Tour) build on top of shadcn primitives. They look right out of the box but lock you into their component structure. You get shadcn styling without shadcn's ownership model.

  3. Headless libraries (Tour Kit, OnboardJS) provide logic without rendering. You bring your own components. Tour Kit was designed for Radix/shadcn from day one; OnboardJS takes a state-machine approach but doesn't mention shadcn in its docs.

Detailed comparison

LibraryBundle size (gzipped)Styling approachshadcn native?Headless?React 19?WCAG 2.1 AA?
Tour Kitcore <8KB, react <12KBHeadless + TailwindYes (built for it)YesYesYes
React Joyride~12-15KBOwn CSS + custom componentsNoPartialPartialNo claim
Driver.js~5KBOwn CSSNoNoYesNo claim
Shepherd.js~25KBOwn CSS (shepherd.css)NoNoYesNo claim
Intro.js~15KBOwn CSS, opinionatedNoNoPartialNo claim
OnboardJSUnspecifiedHeadless (BYOUI)CompatibleYesYesNo claim
shadcn/tourMinimalTailwind/shadcnYesNoPartialNo claim

Sources: npm, GitHub, bundlephobia. Data verified April 2026. "No claim" means no explicit WCAG compliance statement found in docs or README.

React Joyride has the most npm downloads by a wide margin (roughly 2.5x the second-place library). But download count measures adoption, not compatibility with your specific stack. A library built five years before shadcn existed wasn't designed for the copy-paste-own workflow.

Decision framework

If you need full design control with shadcn/ui components, use Tour Kit. You render every tour step with your existing Card, Button, Badge, and Popover components. The tour logic (step sequencing, highlighting, focus trapping, keyboard nav) lives in hooks. Your Tailwind classes apply directly. No CSS imports. No overrides.

If you need the lightest possible bundle and don't care about shadcn, use Driver.js. At ~5KB gzipped, it's the smallest option. But you'll import driver.css and your tour will look different from the rest of your app.

If you want a quick shadcn-styled tour without headless architecture, try shadcn/tour by NiazMorshed2007. It uses shadcn/ui primitives natively. The tradeoff is fewer features (no analytics, no checklists, no surveys) and a smaller community.

If your project doesn't use React, use Shepherd.js. It's framework-agnostic, battle-tested, and has the broadest compatibility. Budget ~25KB gzipped and CSS customization work to match your theme.

If you need the full onboarding lifecycle (tours + surveys + checklists + announcements + adoption tracking), Tour Kit ships all of these as composable packages. No other library in this comparison covers the full spectrum. Install only what you need.

What we recommend (and why)

We recommend Tour Kit for shadcn/ui projects. Full disclosure: we built it. Here is why we think the architecture matters, with enough detail for you to verify and decide.

The shadcn/ui community has asked for a tour component since 2023. One developer in Issue #999 said it plainly: "A fully headless provider for managing steps would be much more 'shadcn' style." That's exactly what Tour Kit provides. You use useTour() and useStep() hooks for logic, then render with whatever components you want.

Here is a minimal example using shadcn/ui Card:

// src/components/TourStep.tsx
import { Card, CardContent, CardFooter } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { useStep } from "@tourkit/react";

export function TourStep() {
  const { title, content, isFirst, isLast, next, prev, stop } = useStep();
  return (
    <Card className="w-80 shadow-lg">
      <CardContent className="pt-6">
        <h3 className="font-semibold text-sm">{title}</h3>
        <p className="text-muted-foreground text-sm mt-2">{content}</p>
      </CardContent>
      <CardFooter className="flex justify-between">
        {!isFirst && (
          <Button variant="ghost" size="sm" onClick={prev}>Back</Button>
        )}
        {isLast ? (
          <Button size="sm" onClick={stop}>Done</Button>
        ) : (
          <Button size="sm" onClick={next}>Next</Button>
        )}
      </CardFooter>
    </Card>
  );
}

That's your design system rendering the tour. Not a third-party tooltip with an override chain. The Card inherits your CSS variables, dark mode, border radius tokens, and font stack automatically.

Tour Kit handles the parts that are genuinely hard to build yourself: element highlighting with scroll-into-view, focus trapping that meets WCAG 2.1 AA, keyboard navigation (Escape to dismiss, Tab to cycle, arrow keys to navigate), and screen reader announcements via live regions. Returning users don't see tours again thanks to localStorage persistence. Core ships under 8KB gzipped with zero runtime dependencies.

Where Tour Kit falls short: it requires React 18+ (no older React support), has a smaller community than React Joyride or Shepherd.js, and there's no visual builder. You write tour configurations in code. If your product team needs a drag-and-drop tour editor, it isn't the right fit today.

Explore the full docs and working examples at usertourkit.com.

npm install @tourkit/core @tourkit/react

FAQ

Does shadcn/ui have a built-in tour component?

No. shadcn/ui does not include a tour component as of April 2026. Issue #999 requested one in 2023 and was closed without implementation. Radix UI also lacks a tour primitive. A shadcn compatible tour library like Tour Kit fills this gap with headless tour logic that pairs with your existing components.

Can I use React Joyride with shadcn/ui?

You can, but it requires CSS overrides. React Joyride ships its own tooltip rendering and styling system. Matching your shadcn/ui theme means overriding Joyride's defaults with your Tailwind design tokens. It works, but you're fighting two styling systems. A headless shadcn compatible tour library avoids this entirely.

What makes a tour library "shadcn compatible"?

A truly shadcn compatible tour library follows the same philosophy as shadcn/ui: provide logic, let developers own the UI. Headless architecture (hooks, not pre-built tooltips), Tailwind-native styling (no imported CSS), and composition patterns that work with Radix primitives. Tour Kit was designed around these principles.

How much does Tour Kit cost?

Tour Kit's core packages (@tourkit/core, @tourkit/react, @tourkit/hints) are MIT licensed and free. Extended packages (analytics, surveys, checklists, announcements) require a one-time Pro license at $99. No per-seat fees, no MAU pricing. Full breakdown at usertourkit.com.

Is Tour Kit accessible?

Tour Kit targets WCAG 2.1 AA compliance. The core handles focus trapping, keyboard navigation (Escape, Tab, arrow keys), screen reader announcements via ARIA live regions, and prefers-reduced-motion support. The Radix maintainer's concern about isolating page portions for accessibility is exactly the problem Tour Kit's highlighting engine addresses.

Ready to try userTourKit?

$ pnpm add @tour-kit/react