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

pcf-dev-proxy

v3.2.3

Published

HTTPS MITM proxy that intercepts deployed PCF bundle requests and serves local files with hot module reload.

Readme

pcf-dev-proxy

HTTPS MITM proxy for PCF development against live Dataverse pages.

By default it intercepts control assets and serves local build output. With --hot, it also enables deterministic in-place PCF control hot-reload (no full page refresh).

Quick start

npx pcf-dev-proxy

This auto-detects ControlManifest.Input.xml, resolves cc_<namespace>.<constructor>, and serves files from out/controls/<constructor>.

Hot mode (no full page reload)

npx pcf-dev-proxy --hot

Hot mode injects an HMR client into bundle.js — any browser connecting through the proxy gets live reload automatically. It adds:

  • local HMR control plane on 127.0.0.1 (default port 8643)
  • direct WebSocket from page to control plane
  • in-page runtime instrumentation for PCF instance swap
  • CSP header stripping on passthrough responses (hot mode only)

Trigger reload from your build pipeline

Primary workflow is explicit trigger from build completion:

npx pcf-dev-proxy reload \
  --control cc_Contoso.MyControl \
  --trigger pcf-start \
  --build-id "$(date -u +%Y-%m-%dT%H:%M:%SZ)"

Optional fallback watcher:

npx pcf-dev-proxy --hot --watch-bundle

Control plane API

When hot mode is enabled (--hot):

  • GET /health
  • POST /reload
  • POST /ack
  • GET /last-ack

Example reload payload:

{ "controlName": "cc_Contoso.MyControl", "buildId": "2026-02-27T12:34:56.789Z", "trigger": "pcf-start" }

Example ACK payload from runtime:

{ "id": "r-123", "controlName": "cc_Contoso.MyControl", "buildId": "2026-02-27T12:34:56.789Z", "status": "success", "instancesTotal": 2, "instancesReloaded": 2, "durationMs": 184 }

CLI

# start proxy
npx pcf-dev-proxy [options]

# enqueue a reload (no proxy startup)
npx pcf-dev-proxy reload --control <name> [options]

Options:

  • --port <number> Proxy port (default 8642)
  • --ws-port <number> HMR control plane port (default 8643)
  • --dir <path> Directory to serve files from
  • --control <name> Override control name
  • --hot Enable hot mode (default: on). Injects HMR client into bundle.js so any browser through the proxy gets live reload.
  • --no-hot Disable hot mode
  • --watch-bundle Watch bundle.js and auto-trigger reload (hot mode only)

Reload subcommand options:

  • --ws-port <number> Control plane port
  • --control <name> Required control name
  • --build-id <id> Build identifier
  • --trigger <source> Trigger label
  • --changed-files <csv> Optional changed files metadata

Connecting a browser

The proxy prints connection commands on startup. Use a dedicated profile so proxy settings don't affect your daily browsing:

# Chrome (macOS)
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --proxy-server=127.0.0.1:8642 \
  --ignore-certificate-errors-spki-list=<SPKI from proxy output> \
  --user-data-dir=~/.pcf-dev-proxy/chrome-profile \
  --disable-session-crashed-bubble

The profile at ~/.pcf-dev-proxy/chrome-profile is persistent — your Dataverse login, cookies, and session survive across proxy restarts.

Playwright and agent-browser work too — see the proxy startup output for copy-pasteable commands.

Typical PCF workflow

# terminal 1 — build watcher
pcf-start

# terminal 2 — proxy (prints connection commands)
npx pcf-dev-proxy --hot

# terminal 3 — launch browser using the command from proxy output

# terminal 4 (or post-build hook) — trigger reload after build completes
npx pcf-dev-proxy reload --control cc_Contoso.MyControl --trigger pcf-start

Troubleshooting

  • No reload applied: check GET /last-ack for latest runtime status.
  • ACK timeout: ensure Dataverse tab is open in a browser connected through the proxy.
  • Multiple rapid builds: queue is latest-wins per control; only newest pending reload is applied.

Requirements

  • Node.js >= 18
  • A Chromium-based browser (Chrome, Edge, Playwright, agent-browser)
  • A PCF project with ControlManifest.Input.xml

License

MIT