Free & open source · MIT licensed

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.

npm install @capsbharg/sparkguide-js · ~7.4 KB gzipped · no dependencies

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.