@tour-kit/core + @tour-kit/react · Free in development
Product tours your users
actually finish.
A React product tour library built headless-first, spotlight overlays, router-aware steps, and WCAG 2.1 AA accessibility, styled by your design system.
$ pnpm add @tour-kit/reactTree-shakeable core · TypeScript strict · WCAG 2.1 AA · own your code
Why tours get skipped
Most product tours die one of three deaths: they break, they bloat, or they look like a foreign object. None of those are user problems, they're library problems.
Tours break on route changes
window.location-based libraries shatter the moment you migrate routers or lazy-mount a target.
Router-aware by design
First-class adapters for Next.js (App + Pages), React Router, and TanStack Router; targets re-resolve on navigation.
47KB to show three tooltips
Legacy tour libraries ship more JavaScript than React itself, and your users pay the download.
Under 4 KB tree-shaken
Import one hook from the headless core and you ship under 4 KB; the rest tree-shakes away. Styled components stay under 12 KB gzipped. Code-splits cleanly behind a dynamic import.
Looks like a browser extension
Injected CSS and fixed themes make every tour look bolted on, brand teams notice.
Your components, your tokens
Headless hooks plus shadcn-native styled components, the tour is indistinguishable from your product.
Three steps to production
No iframe embeds, no script tags, no vendor dashboard. The code lands in your repo.
- 1
Install
One package, zero config.
terminalpnpm add @tour-kit/react - 2
Compose
Declarative config, headless or pre-styled, the tour renders with your design system.
onboarding.tsximport { Tour, TourStep } from '@tour-kit/react' <Tour id="welcome"> <TourStep target="#sidebar" title="Navigation" content="Browse your projects here." /> </Tour> - 3
Ship it
The tour lives in your bundle and your version control, no embed script, no vendor dashboard.
Read the docs
Two ways in. Same engine.
Start with the styled components and eject to headless when the design team comes knocking, both packages share the same core and the same licence.
@tour-kit/react
Pre-styled components, the fast path
Drop-in Tour, TourStep, spotlight overlay, and card, shadcn-native styling, router adapters, and sensible defaults. Most teams ship with this.
React docs@tour-kit/core
Headless engine, total control
Hooks, positioning, focus management, and state with zero UI opinions, render every pixel yourself, in any framework wrapper.
Core docsEverything a tour needs to survive production
Three pillars every userTourKit package shares, plus the tour-specific engineering that DIY attempts discover the hard way.
Headless or pre-styled
Styled Tour/TourStep components for speed, headless hooks for control, same engine underneath.
WCAG 2.1 AA accessible
Focus trap, keyboard navigation, screen-reader announcements, reduced-motion, Lighthouse a11y 100.
The code lands in your repo
Free while you build, one-time when you ship. Tours are TypeScript in your bundle, not a script tag from a vendor.
Router adapters
Next.js App & Pages Router, React Router, TanStack Router, multi-page tours that survive navigation.
Progress persistence
localStorage by default, or your API via a one-line storage adapter, returning users resume, not restart.
Tour analytics
@tour-kit/analyticsStep views, completions, and drop-offs streamed to PostHog, Mixpanel, Amplitude, or GA4.
Build your first tour, free in development, no signup.
Install the package and ship a tour today. Pro packages add checklists, announcements, and surveys when you need them.
Free in development, no signup, no credit card.
The third option between SaaS and DIY
| userTourKit | SaaS platforms | OSS libraries | |
|---|---|---|---|
| Cost | Free in dev, from $9.99 | $200–900/mo | Free |
| Bundle impact | Under 4 KB per hook | External script | 30–50KB |
| Headless mode | ✓ | — | — |
The honest pitch
Why pick a fresh library?
Tour Kit is new, no legacy API debt, no corporate-UX baggage, no AGPL contamination. Built headless-first so you bring your own components and styles. Every chip below is a measured technical fact, not a marketing claim.
- Under 4 KB tree-shaken
- WCAG 2.1 AA
- Lighthouse a11y 100
- TypeScript strict
- >80% test coverage
- Free in development
- React 19 ready
- shadcn-native
See the documentation or source on GitHub.
Tour questions, answered straight
What developers ask before adding a product tour dependency.
Tour Kit is source-available under BSL 1.1: free for development, evaluation, testing and CI, with no feature gates and no MAU caps. A production deployment needs a one-time licence key, from $9.99 for a single project.
Yes. Router adapters ship for the Next.js App Router, Pages Router, React Router, and TanStack Router, and the positioner re-queries targets on route changes and DOM mutations. If a target disappears mid-tour you choose: skip the step, wait for it, or fall back to a centered dialog.
WCAG 2.1 AA: focus is trapped in the active step, Tab order is managed, Esc ends the tour, steps are announced to screen readers, and animations honor prefers-reduced-motion. Lighthouse accessibility scores 100, it is a release gate, not an aspiration.
Both. @tour-kit/react ships pre-styled, shadcn-native Tour/TourStep components for the fast path, and every behavior is available through headless hooks from @tour-kit/core when you want to render entirely your own UI.
Everything is tree-shakeable ESM: import one hook and you ship under 4 KB of core, and the React components stay under 12 KB gzipped. Tours code-split cleanly behind a dynamic import, so a route that never shows a tour never downloads one.
Own your onboarding. Ship it today.
Free in development, tree-shakeable to the hook you call. The tour library you'd have built with three spare weeks.
$pnpm add @tour-kit/react