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

@loopcheck/qa-sdk

v1.0.1

Published

Loopcheck browser SDK for element identity and session recording

Readme

@loopcheck/qa-sdk

Browser instrumentation for Loopcheck. The SDK answers two questions:

  1. What did the user interact with?
  2. How do we identify that element stably?

It does not generate Playwright tests — that belongs to the Loopcheck automation engine.

Installation

pnpm add @loopcheck/qa-sdk

Peer dependency: react >= 18 (only if you use @loopcheck/qa-sdk/react).

Quick start (publishable key)

  1. In Loopcheck → Project settings → Publishable keys, create a key (lc_pk_…).
  2. Wrap your app. The SDK stays inert until you call startRecording() (safe behind a login wall).
"use client";

import { QAProvider, useQA } from "@loopcheck/qa-sdk/react";

export function Providers({ children }: { children: React.ReactNode }) {
  return (
    <QAProvider
      config={{
        apiUrl: "https://api.loopcheck.dev", // your Loopcheck API origin
        publishableKey: process.env.NEXT_PUBLIC_LOOPCHECK_KEY!,
        // default: inert until startRecording()
        startOn: "manual",
      }}
    >
      {children}
    </QAProvider>
  );
}

function RecordToolbar() {
  const { startRecording, stopRecording, isRecording } = useQA();
  return (
    <button
      type="button"
      onClick={() => void (isRecording ? stopRecording() : startRecording())}
    >
      {isRecording ? "Stop" : "Record"}
    </button>
  );
}

startRecording():

  1. POST /v1/sdk/sessions with the publishable key (no Loopcheck login cookie).
  2. Attaches listeners and posts events to /v1/sdk/events.

Auth gate

Keep the provider mounted for all visitors. Call startRecording() only after the user is logged into your app (or from an internal QA toolbar). Until then the SDK does not attach listeners or make network calls.

To arm from the URL instead:

<QAProvider
  config={{
    apiUrl: "https://api.loopcheck.dev",
    publishableKey: process.env.NEXT_PUBLIC_LOOPCHECK_KEY!,
    startOn: "query", // starts when ?lc_record=1
  }}
>

Configuration

| Field | Default | Purpose | |---|---|---| | publishableKey | — | Durable browser key (lc_pk_…) from project settings | | apiUrl | "" | Loopcheck API origin | | projectId | resolved on session create | Optional; filled from the key response | | sessionId | — | Pre-minted session (extension / dashboard flow) | | publicClientToken | — | Alias / legacy session token (lc_pub_…) | | startOn | manual | manual | query (?lc_record=1) | | enabled | true | Master switch | | mode | inert for key-only installs | disabled | observe | record | | debug | false | Inspector overlay (Alt+Shift+hover) | | recordInputValues | false | Values are [REDACTED] unless true and not sensitive | | transport | HTTP | Replaceable QATransport |

All config is passed explicitly. The SDK never reads DATABASE_URL, SESSION_SECRET, or other server secrets.

React helpers

import { QAProvider, useQA, useQAElement, QAButton } from "@loopcheck/qa-sdk/react";

function CheckoutButton() {
  const ref = useQAElement("checkout.continue");
  return <button ref={ref}>Continue</button>;
}

Or stamp the DOM yourself:

<button data-qa-id="checkout.continue">Continue</button>

Privacy

Always redacted: passwords, data-qa-sensitive, card/CVV-like fields, and redactSelectors. Fetch uses credentials: "omit". Cookies and authorization headers are never collected.

Extension / dashboard recording

The Chrome extension and Loopcheck record UI still mint one-shot lc_pub_… session tokens via recordings.create. That path is unchanged. Prefer publishable keys for embedding the SDK in a customer app.

Troubleshooting

| Symptom | Fix | |---|---| | Empty recordings | Call startRecording() after login, or set startOn: "query" with ?lc_record=1 | | 401 on session create | Check the publishable key and optional origin allowlist | | Hydration warnings | Keep QAProvider in a Client Component | | Network errors in console | Swallowed by default; use onError |

License

Proprietary — UNLICENSED. Not open source.