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

@celestialsynthesis/flowr-sdk-replay

v0.1.1

Published

FlowR guided-replay SDK — embed in-page replays of FlowR recordings without the browser extension.

Readme

@celestialsynthesis/flowr-sdk-replay

FlowR replay SDK for embedding guided walkthrough replay inside a normal web page without the browser extension.

Version: 0.1.1

Public package repo: https://github.com/Celestial-Synthesis/flowr-web-sdk/tree/main/sdk-replay

Install

npm install @celestialsynthesis/flowr-sdk-replay

CDN Import

Use an immutable tag for production embeds:

<script type="module">
  import { replay } from "https://cdn.jsdelivr.net/gh/Celestial-Synthesis/flowr-web-sdk@sdk_v0.1.1/sdk-replay/dist/index.js";

  const handle = replay({
    baseUrl: "https://rfeiamxssoajeabwyean.supabase.co",
    recordingId: "rec_...",
    token: "shr_...",
  });

  await handle.start();
</script>

Replay supports both FlowR's built-in bubble/panel shell and a dedicated host-controlled mode.

Built-In Replay UI

If you want FlowR's built-in replay UI, initialize the handle with uiMode: "sdk-ui" or omit the option and open it. With a direct recordingId + token or recording payload, the built-in panel is ready to guide the user through replay:

const handle = replay({
  baseUrl,
  recordingId: "rec_...",
  token: "shr_...",
  uiMode: "sdk-ui",
});

handle.open();

Host-Controlled Replay

Set uiMode: "custom" when your page already has its own buttons or control rail and you do not want the built-in replay bubble/panel chrome mounted on screen. Replay still uses the shared Shadow DOM host for highlights, tooltips, and overlays, but start/stop/list/select actions stay with your app:

const handle = replay({
  baseUrl,
  apiKey,
  uiMode: "custom",
  lazy: true,
});

const recordings = await handle.listRecordings();
if (recordings[0]) {
  handle.setRecording(recordings[0]);
  await handle.start();
}

document.querySelector("#stopReplay")?.addEventListener("click", () => {
  handle.stop();
});

If you need server-side paging or title filtering for your own selector UI, call listRecordings({ limit, cursor, title }) instead:

const firstPage = await handle.listRecordings({ limit: 10, title: "checkout" });
const nextPage = firstPage.nextCursor
  ? await handle.listRecordings({ limit: 10, cursor: firstPage.nextCursor, title: "checkout" })
  : null;

listRecordings() without arguments returns the full public list for that backend + publishable key. listRecordings({ limit, cursor, title }) returns one backend page in { recordings, nextCursor } form.

title filters by recording title only, uses a case-insensitive server-side match, and should be sent on each paged request while you follow nextCursor.

Public Recording Picker

Use a FlowR publishable key with uiMode: "sdk-ui" when you want the built-in picker, or combine it with uiMode: "custom" when your host page will call listRecordings() or listRecordings({ limit, cursor, title }) and render its own selector:

const handle = replay({
  baseUrl,
  apiKey,
  lazy: true,
});

const recordings = await handle.listRecordings();
if (recordings[0]) {
  handle.setRecording(recordings[0]);
  await handle.start();
}

Common Operations

handle.open();
handle.close();
handle.stop();
handle.on("complete", () => console.log("Replay finished"));
handle.on("navigation-required", ({ targetUrl }) => console.log(targetUrl));

Bundled FlowR Dependencies

The source workspace uses these FlowR packages, but this public browser bundle already includes them. You do not need to import them separately from jsDelivr:

  • @flowr/sdk-core
  • @flowr/sdk-rest
  • @flowr/shared-core

Included Files

  • dist/index.js - ESM browser bundle
  • dist/index.cjs - CommonJS bundle
  • dist/index.d.ts - TypeScript declarations
  • dist/*.js - optional ESM chunks loaded by dist/index.js when needed
  • package.json - public package metadata