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

peertube-plugin-universal-paywall

v0.0.1

Published

Per-view onchain settlement for PeerTube via the Universal Paywall rail (action:api.video.viewed -> facilitator charge).

Readme

peertube-plugin-universal-paywall

Per-view onchain settlement for PeerTube via the Universal Paywall rail. Registers the action:api.video.viewed server hook and reports each view as a metered charge to the facilitator — no PeerTube core fork (PeerTube has no native view webhook, so a published plugin is the attachment point; the enabling req.rawBody change landed in PeerTube PR #6300).

Install (operator)

  1. Admin → Plugins → search/install universal-paywall (or install from disk for a local build).
  2. Configure settings:
    • Facilitator URL / Facilitator API key — the Universal Paywall facilitator.
    • Price per view (micro-USDC) — e.g. 1000.
    • Viewer wallet map — JSON { "<payerKey>": "0x…" } (the registry/moat).
    • Channel wallet map — JSON { "<channelId>": "0x…" }.

On each view, the plugin resolves the payer (from an x-payer-user header stamped by a viewer client / the browser-extension adaptor; anonymous views are metered-and-skipped) and the channel wallet, then charges price to the rail.

Develop / test

npm test    # node test.mjs — drives register() + the view hook against a mock facilitator

The core logic is in main.js (register({ registerHook, registerSetting, settingsManager })). test.mjs proves: settings registered, the view hook fires a charge with the resolved viewer/channel wallets and configured price, and unknown-payer / unconfigured cases make no charge.

Build (self-contained) + publish

@universal-paywall/integrations is a workspace package (not on npm), so a raw yarn install of this plugin would fail. npm run build (esbuild) bundles it + its deps into a single self-contained dist/main.js, so the published plugin has no external runtime dependency. To publish: build, point library at dist/main.js (and drop the dependency), then npm publish /submit to the PeerTube plugin index. Publishing is the only step that can't be done from CI.

Verified on a real PeerTube (2026-06-21)

The self-contained bundle was installed into a live PeerTube 7.3.0 (postgres + redis): the plugin installs, registers the action:api.video.viewed hook + its settings, and is enabled (confirmed via logs + the /api/v1/plugins API), and is configurable through PUT /api/v1/plugins/.../settings. Note: the hook fires only on a PeerTube counted view (its anti-fraud watch-time threshold + viewer-stats processing), which a real player session drives. Verified end-to-end via e2e-player-docker.mjs (real headless-browser player -> counted view -> hook -> on-chain settle). That run also surfaced + fixed a real bug: the hook's video is an MVideoImmutable with no channelId, so the plugin keys the creator on video.channelId ?? video.id.