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

@ripl/devtools

v1.4.0

Published

Runtime bridge connecting Ripl contexts, scenes, and renderers to the Ripl devtools browser extension

Readme

@ripl/devtools

npm license size

The page-side bridge between a Ripl context and the Ripl Devtools browser extension: live scene-graph inspection, property editing and event recording.

Features

  • One call to bindcreateDevtools(context, scene?, renderer?) announces the binding to the extension, streams the scene graph on request, and applies commands sent back: element property edits, renderer debug overlay toggles and hover highlighting.
  • Idle until connected — until the devtools panel connects, a binding only announces itself. No serialization, no listeners, effectively no runtime cost from shipping one.
  • Chunked, idle-time snapshots — once connected, tree snapshots serialize during browser idle time and stream in small chunks, so a large scene never blocks rendering.
  • Event recording is a second opt-in — nothing is observed until the panel's Events tab asks, and the subscription is torn down when it stops. It subscribes through EventBus's '*' wildcard, which has() cannot see, so recording never turns an element into a hit-test target. High-frequency types (updated, render, tick) are excluded by default and filtering happens in the page, so suppressed events never reach the wire.
  • Version and capability reporting — each binding reports the Ripl version it was built against (RIPL_VERSION, ContextInfo.riplVersion) and the optional protocol features it implements (ContextInfo.capabilities), so a newer extension paired with an older bridge degrades with an explanation rather than showing nothing.
  • Multiple contexts per page — call createDevtools once per context; calling it again for an already-bound context returns the existing binding.

Installation

# npm
npm install @ripl/devtools

# yarn
yarn add @ripl/devtools

# pnpm
pnpm add @ripl/devtools

Pair it with the Ripl Devtools browser extension, which adds a Ripl panel with an Elements tab (element tree, editable properties, renderer debug switches, listener information) and an Events tab (scrubbable timeline, event list, payload details), plus a toolbar icon showing whether Ripl was detected on the page.

Quick start

import {
    createDevtools,
} from '@ripl/devtools';

import {
    createContext,
    createRenderer,
    createScene,
} from '@ripl/web';

const context = createContext('.mount-element');
const scene = createScene(context);
const renderer = createRenderer(scene);

if (import.meta.env.DEV) {
    const devtools = createDevtools(context, scene, renderer);

    // devtools.dispose();
}

The scene and renderer are optional; a context alone is enough to inspect.

Key API

| Export | What it does | | --- | --- | | createDevtools | Binds a context, scene and renderer to the extension | | Devtools | The binding itself, with dispose() for teardown | | DevtoolsOptions | label for identifying a binding in the UI | | RIPL_VERSION | The Ripl version a binding was built against |

Related packages

  • @ripl/web — the browser entry point supplying the context, scene and renderer
  • @ripl/core — the scene graph and event bus this bridge observes
  • @ripl/charts — charts expose chart.scene and chart.renderer, so they bind the same way

Documentation

Guides and the full API reference are at ripl.run/docs/core/advanced/devtools. The extension source lives in this repository under apps/devtools-extension.

License

MIT