npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

posthog-tours

v0.2.0

Published

A TypeScript package for creating guided tours in PostHog

Downloads

195

Readme

PostHog Tours

A TypeScript package for creating guided product tours in PostHog, leveraging feature flags and user properties to deliver targeted onboarding experiences.

Installation

npm install posthog-tours

or

yarn add posthog-tours

Features

  • Uses PostHog feature flags to control tour visibility
  • Tracks seen tours with PostHog user properties
  • Shows tours only when elements are present on screen
  • Provides callbacks when a tour becomes eligible to show
  • Monitors element visibility with Intersection Observer
  • Supports custom CSS selectors for targeting elements

Usage

import { PostHogTours } from "posthog-tours";

// Initialize PostHogTours
const tours = new PostHogTours({
  tours: {
    "feature-flag-key": {
      // This key must match a PostHog feature flag
      name: "My Feature Tour",
      target: ".feature-element", // CSS selector for the element to highlight
      onEligible: (element, tourId) => {
        // Custom callback when tour becomes eligible to show
        // Implementation of your tour UI goes here

        // When the user completes or dismisses the tour, mark it as seen
        tours.markTourAsSeen(tourId);
      },
    },
  },
  userPropertyPrefix: "seen_tour_", // Prefix for PostHog user properties
  defaultOnEligible: (element, tourId) => {
    // Default handler for all tours if they don't specify their own
  },
  checkElementVisibility: true, // Whether to check if elements are visible before showing tour
});

A tour becomes eligible when:

  1. The matching feature flag is enabled for the user
  2. The target element is present and visible on the screen
  3. The user has not seen the tour before (based on user properties)

Advanced Usage

Multiple Tours

const tours = new PostHogTours({
  tours: {
    "dashboard-intro": {
      name: "Dashboard Introduction",
      target: ".dashboard-container",
      onEligible: (element, tourId) => {
        // Custom handling for this specific tour
      },
    },
    "analytics-intro": {
      name: "Analytics Introduction",
      target: ".analytics-container",
      // Using defaultOnEligible since no specific handler provided
    },
  },
  defaultOnEligible: (element, tourId) => {
    // Default handler for all tours that don't specify their own
    console.log(`Tour ${tourId} is ready to show`);
    // Your UI implementation here
  },
});

// Check eligibility of all tours
async function checkForEligibleTours() {
  const results = await tours.checkAllTours();

  // The first eligible tour will have already triggered its callback
  const eligibleTour = results.find((result) => result.eligible);

  if (eligibleTour) {
    console.log(`Tour ${eligibleTour.tourId} is now showing`);
  }
}

// Force a specific tour to show regardless of conditions
async function showSpecificTour(tourId: string) {
  const success = await tours.forceTour(tourId);
}

// Reset all observers if the app state changes significantly
function onAppStateChange() {
  tours.reset();
}

Tour Eligibility

A tour becomes eligible when all these conditions are met:

  1. The matching feature flag is enabled for the user
  2. The target element is present in the DOM
  3. The element is visible on screen (if checkElementVisibility is true)
  4. The user has not seen the tour before (based on user properties)

You can check a specific tour's eligibility:

const result = await tours.checkTourEligibility("feature-flag-key");
console.log(result);
// {
//   eligible: boolean,
//   element: Element | null,
//   tourId: string,
//   flagEnabled: boolean,
//   targetPresent: boolean,
//   alreadySeen: boolean
// }

Development

  1. Clone the repository
  2. Install dependencies:
    npm install
  3. Build the package:
    npm run build
  4. Run tests:
    npm test

License

MIT