v0.1.0What's new: styles, brand colours and the three-strand light→

Product tours that
find their own way.

Show people around your app with tours that keep working when things scroll, move, or live on another page. Open source, for React, Next.js and React Native.

MIT licensed0 runtime dependencies100+ testsReact ≥ 18 · React Native ≥ 0.73
acme.app/dashboard

Works with

ReactNext.jsViteReact RouterRemixExpoReact NativeReact Navigation
Why Hintbeam

Tours bound to names you own, not to your markup.

Tours are often glued to CSS selectors and page layouts, so a renamed class or a moved button breaks them. Hintbeam tours point at names in a contract your app keeps, so the app can change underneath them.

01

A contract between your app and its tours

defineTargets lists what tours may point at. Any component opts in with one ref, wherever it lives. Restyle it, rename its classes or move it to another page: the tour still finds it.

contract → any component
const targets = defineTargets({
  exportButton: { screen: "/reports" },
});

// anywhere in your app
<Button ref={useTarget("exportButton")}>Export</Button>
02

Any screen, any platform

Tours don't know about pages, layouts or devices; targets do. One tour crosses routes, tabs and layouts, and the same tour runs on the web and in React Native (preview). Adapters for Next.js, React Router, Expo Router and React Navigation, or your own router in a few lines.

/dashboard · sidebar or tab bar
/reports · Take me there✓
one tour · web + React Native
03

Tours are typed data

Point a step at a name that isn't in the contract and TypeScript stops you as you type. Tours that arrive as JSON, from a CMS or your API, get the same check at runtime, with a "did you mean…?". Ship a new tour without a deploy.

steps: [{ target: "exportButon" }]
"exportButon" is not a declared target. Did you mean "exportButton"?
04

Your UI, or ours

Use the built-in card and theme it to your brand, render your own card, or go fully headless. Every decision lives in a core with zero dependencies and no React, so new platforms and renderers sit on the same engine.

three levels
<TourProvider theme={createTourTheme({ brand })} />
<TourProvider renderStep={(step) => <MyCard step={step} />} />
const step = useTourStep(); // headless
Why it keeps working

Tours that don't break when your app moves.

Hintbeam checks where the element is right now — when a step appears, when the page scrolls, and when the element itself mounts late. Wherever it turns out to be, the tour knows what to do.

1Right there

The tour points straight at it, wherever your layout happens to put it.

2Further down the page

The tour shows which way to scroll, and Show me takes you to it.

3On another page

The tour lights up the link, and Take me there goes to that page.

4Not on screen

The tour says so plainly and lets you move on. It never points at empty space.

What you get

Everything else a good tour needs.

Steps that wait for the user, a look that matches your product, events for your analytics, and care for every user.

Steps that wait for the user

A step can wait for a real tap, for a page to open, or for your app to finish something. A timeout makes sure nobody gets stuck.

advanceOn: "tap"
advanceOn: "arrive"
emit("report.exported")✓

Fits your product

Pick how much is going on and use your brand colour. Every tour on this site changes as you choose — the demo above too.

Know what people do

Every start, step, skip and finish is an event you can send to your analytics. Plugins add more — audiences, tours loaded from your server, new line styles.

start first-meal
step 2 · tap
complete first-meal✓

Considerate by default

  • Read out once by screen readers
  • Never steals focus or blocks a tap
  • Keyboard: ← → and Esc
  • Calmer for people who prefer less motion
Get started

Your first tour in four steps.

Copy, paste, adjust. The getting-started guide covers every router and option.

npm install hintbeam

# That's all. No CSS to import, no config file.

Or let your coding agent do it.

Paste this into Claude Code, Cursor, Copilot or any coding agent. It reads the full docs from llms-full.txt and does the four steps in your app.

Prompt for your coding agent
Add a product tour to this app with Hintbeam (https://hintbeam.js.org). First download https://hintbeam.js.org/llms-full.txt and read all of it (for example with curl; a summarised fetch leaves out details you need). It is the complete documentation. Then:
1. Detect the framework (Next.js App Router, React Router, Expo Router, React Navigation or plain React) and install `hintbeam`.
2. Follow "Getting started" for that framework: list the targets with `defineTargets` in `tours.ts`, add the `declare module "hintbeam"` Register block, and wrap the app in `TourProvider` with the matching router adapter and storage (`browserTourStorage()` on the web, `createTourStorage(AsyncStorage)` on React Native).
3. Ask me which flow to guide, or propose a 3–5 step first-run tour of the main screens.
4. Attach `useTarget("name")` to those elements. Never use CSS selectors. In the Next.js App Router, keep pages as Server Components and put the tagged elements in small "use client" components; import `tours.ts` only from client files.
5. Write the tour with `defineTour`, and start it with `useTour().startOnce(tour)` from a client component rendered inside `TourProvider`.
6. Run the type check, the build and the tests (say so if the project has none), then show me the diff.
Questions

Questions people ask first.

Is it free?
Yes. It's MIT-licensed, so you can use it in commercial products. There are no keys, no accounts and no tracking.
Will the tour cover or block my app?
No. The page stays usable the whole time — people can tap the real button a step is about. The dimmed background never blocks clicks, and you can turn it off with backdrop: 0.
Which frameworks and routers does it work with?
React 18 and up, Next.js (App Router), Vite, Remix, React Native 0.73 and up, and Expo. There are ready-made adapters for Next.js, React Router, Expo Router and React Navigation, and any other router takes two lines with useRouterAdapter. No router at all is fine too.
Does it work with Next.js server components?
Yes. Its components are marked "use client". Put the provider in a client component, as in the Next.js example above, and keep the rest of your layout on the server.
Can I make it look like my product?
Yes, as much as you like. createTourTheme sets your brand colour and one of four styles, from Aurora to Minimal. Every colour, corner and effect can be changed on its own. For a completely different look, render your own card with renderStep or the headless useTourStep hook.
Can someone change a tour without a code change?
Tours are plain data, so you can load them from your CMS or database. parseTour checks them before they play, with clear messages for mistakes. A hosted visual editor is on the roadmap but isn't available yet.
What happens if a step's element isn't there?
The step says it can't find it right now and lets the person carry on. During development, you also get a console warning naming the element, so you can fix the tour.
Does it remember where people got to?
Yes. Skipping pauses a tour, and it can pick up where it left off. Keep progress in localStorage, React Native's AsyncStorage, or your own server.
Can I translate it?
Yes. Every word the tour shows — Next, Back, Skip and the rest — comes from labels, and the step text is your own content. The playground has Spanish and Hindi examples.
Is it accessible?
Each step is read out once by screen readers, focus is never moved, the keyboard works (← → and Esc), and motion calms down for people who ask their device for less. Screen-reader testing on real phones is still on the roadmap, and we'll say so until it's done.
Open source

Yours to read, fork and depend on.

MIT, with no keys, no telemetry and nothing that phones home. Versioned with care, so upgrading is never a gamble.

How it is run

The promises behind every release.

  • Semantic versioning, written downBreaking changes only in a major release, after at least one minor release of deprecation warnings. Read the policy
  • A changelog for every releaseEach change says what it means for you, with the upgrade step when one is needed. Changelog
  • A guarded public APIEvery export is snapshotted in CI. Nothing is renamed or removed by accident.
  • Plugins have their own versionTOUR_PLUGIN_API_VERSION lets add-ons say what they were built for.

Roadmap

What exists, what is next, and what may come later.

  • shippedTours that find their target and follow people across pages, with adapters for Next.js, React Router, Expo Router and React Navigation
  • shippedFive line styles, four looks, brand colours, translations, and a headless hook for your own UI
  • shippedPlugins for analytics, audiences, tours from your server and custom line styles
  • nextTesting on real iPhones and Android phones, including screen readers
  • nextA Next.js example app, and the first release on npm
  • laterChecklists, hotspots and announcements
  • laterA hosted editor and analytics for teams, built on the same open plugins

See it on a real app.

A four-page dashboard with a long feed and a tour editor. Pick a style and your brand colour, then copy the theme.