OnboardJS vs Driver.js
Driver.js Alternative: Why Devs Switch to OnboardJS
Driver.js is impressively lightweight and has great highlighting, but its popover-only approach limits what you can build. OnboardJS lets you render anything—modals, drawers, inline hints, or custom components.
At a Glance
Feature Comparison
| Feature | Driver.js | OnboardJS |
|---|---|---|
| Architecture | Highlight + popover | Headless/native |
| Step Types | Popovers only | Modals, tooltips, inline, custom |
| TypeScript | Good types | Native TypeScript |
| Analytics | None | Built-in tracking |
| Design System | Fixed popover style | Your components (Tailwind/Shadcn) |
| Maintenance | Active | Active, React-first |
Why Switch?
The Architectural Differences
Driver.js is Popovers Only
Driver.js excels at one thing: highlighting elements with popovers. But modern onboarding often needs modals for welcome screens, inline hints, or multi-step wizards. Driver.js can't do that.
Every step is a popover attached to an element
Steps can be popovers, modals, drawers, or completely custom
No React State Integration
Driver.js doesn't integrate with React state. Your tour runs separately from your app, making conditional logic and dynamic steps awkward.
driver.highlight() is imperative, not reactive
Steps can depend on React state and update dynamically
Limited Customization
While Driver.js allows CSS customization, you can't change the fundamental structure of how content is displayed. OnboardJS lets you render any component.
Popover with title, description, buttons—that's it
Render a video player, interactive form, or animated illustration
Migration
Before & After
See the difference in code. OnboardJS lets you use your own components while keeping the API simple.
import { driver } from 'driver.js';
import 'driver.js/dist/driver.css';
const driverObj = driver({
showProgress: true,
steps: [
{
element: '#element',
popover: {
title: 'Welcome',
description: 'Let me show you around',
},
},
],
});
driverObj.drive();
import { OnboardingProvider } from '@onboardjs/react';
const steps = [
{
id: 'welcome',
// No target = modal/fullscreen step
component: ({ onNext }) => (
<Dialog open>
<DialogContent>
<h2>Welcome</h2>
<p>Let me show you around</p>
<Button onClick={onNext}>Get Started</Button>
</DialogContent>
</Dialog>
),
},
{
id: 'feature',
target: '#element',
component: ({ onNext }) => (
<Tooltip>
<p>This is the feature</p>
<Button onClick={onNext}>Next</Button>
</Tooltip>
),
},
];
<OnboardingProvider steps={steps}>
<App />
</OnboardingProvider>
Ready to drop the overlays?
Start building onboarding that feels native to your app.
npm install @onboardjs/core @onboardjs/react