The bottom line
Tour Kit is a headless React library shipping tours, hints, checklists, announcements, analytics, and scheduling in a core bundle under 8KB gzipped. Reactour is a lightweight presentational tour library with 3.9K GitHub stars and 114,000 weekly npm downloads. Tour Kit fits React teams that want full UI control, WCAG 2.1 AA compliance, and room to grow beyond basic tours. Reactour is better when you need a quick, good-looking walkthrough on React 18 without much customization.
What is Tour Kit?
Tour Kit is an open-source headless React library for product tours, onboarding checklists, hints, announcements, analytics, and scheduling, with an MIT-licensed free tier and $99 one-time Pro upgrade.
What is Reactour?
Reactour is an MIT-licensed React component library for building step-based guided tours, maintained by a single developer, with a presentational architecture that renders its own UI and accepts style overrides.
Feature-by-feature comparison
Tours and step types
Both libraries handle the basics: define an array of steps, point each step at a DOM element, show a tooltip. Reactour's step config is clean. You pass a selector, some content, and optional position. It works.
Tour Kit's step config goes deeper. Each step supports advanceOn for auto-advancing on click or input events, route for navigating to a URL before the step shows, and waitForTarget with a configurable timeout for dynamic content. There's also onBeforeShow async guards and conditional branching via onNext.
Branch targets include specific step IDs, skip-N, delay, or cross-tour jumps. Reactour doesn't have branching, route-aware navigation, or event-based advancement.
For linear walkthroughs, both get the job done. For anything involving conditional logic or multi-page flows, Reactour can't handle those cases.
Hints and hotspots
Reactour doesn't have hints. It does tours. That's the scope.
Tour Kit ships a separate @tour-kit/hints package (under 5KB gzipped) for persistent, non-sequential hotspots. Each hint has its own dismiss state and persists across page loads. The component renders a pulsing beacon on the target element, with a tooltip on hover or click.
Need "new feature" indicators or contextual tips outside a tour flow? Tour Kit handles it. With Reactour, you'd build this yourself.
Checklists and onboarding flows
Reactour doesn't offer checklists. Tour Kit's @tour-kit/checklists Pro package ($99 one-time) provides task dependencies with circular dependency detection and three completion types: manual, event-based, or custom check function. Progress calculation tracks locked tasks (blocked by unmet dependencies). Components include Checklist, ChecklistTask, ChecklistProgress, plus a ChecklistPanel launcher. Not something you'd want to build from scratch.
Announcements and banners
Not part of Reactour's scope. Tour Kit's @tour-kit/announcements Pro package has five display variants: modal, toast, banner, slideout, spotlight. Frequency rules control how often each announcement appears (once ever, once per session, every N days). A priority queue ranks announcements from critical to low, and audience targeting filters by user ID, role, or custom logic. This is what separates a tour library from an onboarding toolkit.
Analytics and tracking
Reactour fires no analytics events. You'd need to wire up callbacks manually for every step transition and tour completion.
Tour Kit's @tour-kit/analytics Pro package ships five built-in plugins: PostHog, Mixpanel, Amplitude, Google Analytics 4, and a console logger. The plugin interface is three lines:
const myPlugin: AnalyticsPlugin = {
name: 'my-backend',
track: (event) => fetch('/api/analytics', { method: 'POST', body: JSON.stringify(event) }),
};Event types cover the full lifecycle: tour_started, tour_completed, tour_skipped, step_viewed, hint_dismissed, checklist_completed, and more. Wrap your app in <AnalyticsProvider plugins={[mixpanelPlugin]}> and you're done.
Scheduling and targeting
Reactour shows tours when you tell it to. No time-based scheduling, no timezone awareness, no blackout windows.
Tour Kit's @tour-kit/scheduling Pro package supports start/end dates, time-of-day windows, day-of-week filters, and recurring patterns. Blackout periods with reasons and IANA timezone handling are built in. Presets cover US standard (9-5 ET), US tech (10-6 PT), UK standard, and Australia standard business hours. The <ScheduleGate> component conditionally renders children only when the schedule is active.
Accessibility and WCAG compliance
This is where the gap is widest. Reactour provides a focus scope via @react-aria/focus, configurable keyboard navigation (left/right arrows, Escape), and a handful of ARIA attributes: ariaLabelledBy, closeButtonAriaLabel, and showNavigationScreenReaders. It's better than nothing.
But Reactour doesn't claim WCAG compliance. There's no documented accessibility audit. No aria-live announcements for step transitions. No documented Lighthouse accessibility score. The Chameleon comparison blog notes Reactour has "basic keyboard navigation" and leaves it at that.
Tour Kit ships WCAG 2.1 AA by default, not as an opt-in. That means focus trapping via useFocusTrap, screen reader announcements through aria-live regions, keyboard support for arrow keys and Escape, automatic RTL/LTR detection, and respect for prefers-reduced-motion. Lighthouse Accessibility score: 100.
For any team where accessibility is a compliance requirement rather than a nice-to-have, this gap decides the choice.
Bundle size and performance
Reactour's @reactour/tour package has an unpacked size of 98.5KB. That's the installed footprint before gzipping. The actual transfer size varies, but it's a full presentational component with its own rendering layer, mask system, and popover implementation.
Tour Kit's core ships under 8KB gzipped. The React binding adds under 12KB. Hints: under 5KB. Because Tour Kit is headless, you aren't shipping UI code you'll override anyway. The core contains only logic (hooks, state management, position calculation, storage adapters) and your existing design system components handle the rendering.
For context, 8KB gzipped for the core is smaller than most icon libraries. On a 3G mobile connection, that's roughly 100ms of additional load time versus several hundred for a larger bundle.
Framework support and TypeScript
Both libraries are written in TypeScript. Reactour was rewritten in TypeScript for v2, and ships built-in type definitions. That's good.
Tour Kit uses TypeScript strict mode with full type inference across all 10 packages. Step configs, hook return types, branching targets, storage adapters, schedule definitions: all typed end-to-end. The headless architecture means your custom components get typed props from render functions, not loosely typed style override objects.
On framework support: Reactour is React-only. Tour Kit's core (@tour-kit/core) is framework-agnostic, though the UI components require React 18 or 19.
Tour Kit ships router adapters for Next.js App Router (useNextAppRouter), Pages Router (useNextPagesRouter), and React Router v6+ (useReactRouter). Reactour's SPA routing requires manual state management through the useTour hook.
And then there's React 19. As of March 2026, Reactour's GitHub issue #659 documents a critical compatibility problem: the library bundles its own copy of React, causing duplicate instance errors (TypeError: Cannot read properties of null (reading 'useState')) when used with React 19. The issue was opened in December 2024. Workarounds like --legacy-peer-deps exist but break easily. Tour Kit supports both React 18 and React 19 as peer dependencies.
Licensing and pricing
Both use MIT licenses for their core functionality. Reactour is 100% free, 100% MIT. No paid tier exists.
Tour Kit's free tier (MIT) includes @tour-kit/core, @tour-kit/react, and @tour-kit/hints. Seven Pro packages cover the rest: adoption, analytics, announcements, checklists, media, scheduling, plus licensing. All for $99 one-time. No monthly fees, no MAU limits.
If all you need is basic tours, Reactour costs nothing. But once you need analytics, checklists, or scheduling, Tour Kit's $99 one-time fee beats building those features yourself. It also undercuts SaaS onboarding platforms at $300+/month by a wide margin.
Side-by-side comparison table
| Feature | Tour Kit | Reactour |
|---|---|---|
| Product tours | ✅ Built-in (core, MIT) | ✅ Built-in (MIT) |
| Conditional branching | ✅ Async resolvers, cross-tour jumps | 🚫 Not available |
| Route-aware tours | ✅ Next.js, React Router adapters | ⚙️ Manual via useTour hook |
| Hints and hotspots | ✅ Built-in, under 5KB gzipped | 🚫 Not available |
| Onboarding checklists | ✅ Pro ($99 one-time) | 🚫 Not available |
| Announcements | ✅ Pro (5 display variants) | 🚫 Not available |
| Analytics | ✅ Pro (PostHog, Mixpanel, Amplitude, GA4) | 🚫 Not available |
| Scheduling | ✅ Pro (timezone, recurring, blackouts) | 🚫 Not available |
| WCAG 2.1 AA | ✅ Default, Lighthouse 100 | ⚙️ Basic keyboard + some ARIA |
| Focus trapping | ✅ useFocusTrap hook | ✅ @react-aria/focus |
| Screen reader announcements | ✅ aria-live regions | 🚫 Not available |
| Headless mode | ✅ Full headless + styled variants | 🚫 Presentational only |
| Design system support | ✅ shadcn/ui native, Radix + Base UI | ⚙️ Style functions + CSS vars |
| Core bundle (gzipped) | Under 8KB | ~98.5KB unpacked |
| React 18 support | ✅ | ✅ |
| React 19 support | ✅ | ⚠️ Issue #659 (duplicate React) |
| TypeScript | ✅ Strict mode, full inference | ✅ Built-in types |
| License | MIT (free tier) | MIT |
| Pricing | Free + $99 one-time Pro | Free |
| Active maintainers | Team | 1 (solo) |
Data verified March 2026. Sources: official documentation, npm, GitHub.
When to choose Reactour instead
Choose Reactour if you're building a React 18 project that needs simple, linear walkthroughs with minimal setup. Reactour's API is genuinely pleasant. The TourProvider and useTour pattern is intuitive. Step definitions are clean. The playground at reactour.dev lets you prototype tours quickly.
Reactour also makes sense for internal tools or prototypes where default styling is fine, accessibility compliance isn't a hard requirement, and you don't need analytics, checklists, or multi-page tour orchestration. It's free, it works, and it gets out of your way. For a quick internal admin dashboard walkthrough, Reactour is a perfectly reasonable choice.
If your team accepts solo-maintainer risk and isn't planning to upgrade to React 19 soon, Reactour delivers basic tours with less overhead than setting up a larger library.
When Tour Kit is the better fit
Tour Kit makes more sense when your requirements extend beyond basic tours. Hints, checklists, announcements, analytics, scheduling: Tour Kit covers all of those. Building them on top of Reactour means building them from scratch.
Teams that care about design system consistency will prefer Tour Kit's headless architecture. Instead of overriding Reactour's built-in popover styles to match your shadcn/ui components, you render your own components and Tour Kit provides the logic. The UnifiedSlot pattern supports both Radix UI (asChild) and Base UI (render prop) patterns natively.
If you're on React 19, or planning to upgrade, Tour Kit supports it without workarounds. If WCAG 2.1 AA compliance matters for your product (it probably should), Tour Kit ships it by default.
Multi-page SPA tours with conditional branching? Route-aware steps with persistence across navigations? Tour Kit's architecture was designed for this from day one. Reactour leaves it to you.
Migration path from Reactour to Tour Kit
The core concepts map directly. Reactour's TourProvider becomes Tour Kit's TourKitProvider. The useTour hook becomes Tour Kit's useTour with a similar API surface.
Step definitions:
// Reactour
const steps = [
{ selector: '.my-element', content: 'Hello world', position: 'right' },
];
// Tour Kit
const steps = [
{ id: 'step-1', target: '.my-element', content: 'Hello world', placement: 'right-start' },
];Key differences: Tour Kit steps require an id field. The selector prop becomes target. The position prop becomes placement with 12 options (top/bottom/left/right combined with start/center/end).
Provider setup:
// Reactour
import { TourProvider } from '@reactour/tour';
<TourProvider steps={steps}><App /></TourProvider>
// Tour Kit
import { TourKitProvider, Tour, TourCard, TourOverlay } from '@tour-kit/react';
<TourKitProvider config={{ persistence: true, keyboard: true }}>
<Tour id="main" steps={steps}>
<TourOverlay />
<TourCard>
<TourCardContent />
<TourCardFooter>
<TourNavigation />
</TourCardFooter>
</TourCard>
</Tour>
<App />
</TourKitProvider>Tour Kit uses compound components instead of a single provider with style overrides. More verbose for the initial setup, but each piece is independently customizable or replaceable.
Style overrides vs headless:
Reactour uses react-select-style functions to override component styles:
// Reactour style override
<TourProvider styles={{ popover: (base) => ({ ...base, borderRadius: 8 }) }}>Tour Kit's headless approach skips overrides entirely. Use TourCardHeadless to get full state via render props, then render whatever you want:
// Tour Kit headless
import { TourCardHeadless } from '@tour-kit/react/headless';
<TourCardHeadless>
{({ isActive, currentStep, next, prev, skip }) => (
<YourCustomTooltip step={currentStep} onNext={next} onPrev={prev} />
)}
</TourCardHeadless>The migration is mostly mechanical. A team of one developer can port a typical Reactour setup in an afternoon. The bigger win is what you get afterward: branching, persistence, route awareness, and the option to add hints, checklists, or analytics without switching libraries again.
What developers say
Developer Sandro Roth published an evaluation of React tour libraries in August 2025. He tested multiple options and found that React 19 incompatibility and poor accessibility were dealbreakers across the board. Reactour wasn't included in his final evaluation. He ultimately built a custom solution using XState and Floating UI, concluding that existing libraries didn't meet production requirements.
From the Whatfix comparison (updated 2026): "Reactour is lightweight and flexible at the UI level but leaves state persistence, targeting, analytics, and workflow logic entirely to the application code."
The npm-compare.com assessment: Reactour "lacks the depth of customization found in React Joyride." Which is worth noting since React Joyride itself has deeper customization than Reactour but still uses a presentational architecture.
Chameleon's review highlights Reactour's "limited styling customization compared to other libraries," while acknowledging it's a "great choice" for teams that "want to deploy something that looks fairly good quickly without extensive on-brand customization."
On GitHub, issue #659 has developers reporting the React 19 incompatibility with specific reproduction steps. The useState error from duplicate React instances has been confirmed by multiple users. Separately, issue #192 documents a long-standing scrolling bug where Reactour doesn't properly scroll elements into view.
We built Tour Kit, so take the comparison above with appropriate skepticism. We've tried to cite verifiable sources for every claim. Check the GitHub repos, npm pages, and documentation yourself.
Frequently asked questions
Is Tour Kit free? The core library, React components, and hints package are MIT-licensed and free. Seven Pro packages (analytics, checklists, announcements, adoption, media, scheduling, licensing) cost $99 as a one-time purchase. No subscriptions, no MAU limits.
What is the difference between Tour Kit and Reactour? Tour Kit uses a headless architecture that separates logic from UI, letting you render with your own components. Reactour is presentational, rendering its own UI with style override functions. Tour Kit also covers hints, checklists, announcements, analytics, and scheduling. Reactour focuses on tours only.
Can I migrate from Reactour to Tour Kit? Yes. The core concepts (step definitions, provider pattern, tour hook) map directly. The main change is moving from style overrides to compound components or headless render props. Most migrations take an afternoon for a typical setup.
Does Tour Kit work with React 19? Tour Kit supports React 18 and React 19 as peer dependencies. Reactour has a documented React 19 compatibility issue (GitHub #659) involving duplicate React instances.
What is the bundle size of Tour Kit vs Reactour?
Tour Kit's core is under 8KB gzipped, the React package under 12KB gzipped, and hints under 5KB gzipped. Reactour's @reactour/tour package has an unpacked size of 98.5KB, though the gzipped transfer size is smaller.
Does Reactour support checklists or analytics? No. Reactour is a tour-only library. Checklists, analytics, announcements, and scheduling aren't part of its scope. Tour Kit offers all of these through Pro packages.
Is Reactour still maintained? Reactour isn't abandoned. npm publishes continued through late 2025 (v3.8.0). But it's maintained by a single developer, has 74 open issues, and the last GitHub release with notes was v3.0.0 in August 2022. Community engagement (issue responses, PR reviews, discussion answers) is sporadic.
Which is better for enterprise use? Tour Kit's WCAG 2.1 AA compliance, React 19 support, and extended feature set (analytics, scheduling, checklists) make it more suitable for enterprise applications. Reactour's solo maintainer and limited accessibility documentation are concerns for teams with compliance requirements. Neither library offers an enterprise support SLA.
Final verdict
Reactour is a well-built library from 2017 that does one thing competently: simple React tours. If that's all you need and you're on React 18, it works. For teams building on React 19, needing WCAG compliance, or growing beyond basic walkthroughs into hints, checklists, analytics, and scheduling, Tour Kit's headless architecture and extended package ecosystem cover ground that Reactour was never designed to reach. The $99 Pro tier costs less than a day of engineering time building any one of those features from scratch.