In-app onboarding,
without the bloat.
Product tours, spotlight tooltips, hotspots, modals, banners, and progress checklists — in pure JavaScript, with zero runtime dependencies. Drop it into any web app in minutes.
Everything a user-onboarding flow needs
Every onboarding widget you'd expect from a dedicated product-tour tool, built as one small library instead of a hosted platform.
Product tours
Multi-step guided tours that mix tooltips, hotspots, and modals, with automatic progress persistence and resume.
Spotlight tooltips
Dimmed backdrop, spotlight cutout, and a positioned card that tracks its target through scroll and resize.
Hotspots
Non-blocking pulsing nudges for "hey, try this" moments — standalone or as a step in a guided flow.
Modals & banners
Standalone welcome screens, announcements, and top-of-page banners for anything outside a multi-step tour.
Progress checklists
A floating "getting started" checklist that can be completed by the user or your own app code.
Built-in segmentation
Target a flow by URL pattern, page state, or arbitrary user attributes — no separate targeting engine.
A few lines to a working tour
No build step required, no framework adapters to install.
import { SparkGuide } from '@capsbharg/sparkguide-js';
const guide = new SparkGuide({ theme: { primaryColor: '#4f46e5' } });
guide.addFlow('welcome-tour', {
steps: [
{ type: 'modal', title: 'Welcome 👋', content: 'Let’s take a quick tour.' },
{ target: '#dashboard-nav', content: 'Everything starts here.', placement: 'bottom' },
{ target: '.create-project-btn', content: 'Click here to get started.', advanceOn: 'click' }
]
});
guide.start('welcome-tour');
Why teams pick SparkGuide
Tiny and dependency-free
~7.4 KB gzipped, zero runtime dependencies — just DOM APIs. No React, no Vue, nothing else to install.
Framework-agnostic
Ships as ESM, CommonJS, and an IIFE build for a plain <script> tag. Works with any stack.
SPA-safe by design
Targets resolve via MutationObserver and steps skip themselves automatically if a target is removed mid-tour.
Persistence out of the box
Progress saves to localStorage automatically. Reload mid-tour and pick up exactly where you left off.
Ready to try it?
Explore every feature in a working sample app, or jump straight into the docs.