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

@reticlehq/electron

v3.2.0

Published

Reticle adapter for Electron: makes main-process IPC observable and the window screenshottable, from the two places the renderer cannot reach.

Readme

@reticlehq/electron

Reticle's Electron adapter — the two places a renderer cannot reach.

Everything else Reticle does inside an Electron app is the ordinary browser SDK (@reticlehq/browser). This package exists for the two things the renderer physically cannot do: observe IPC (a contextBridge object is deeply frozen and non-configurable) and screenshot the window (the renderer has no access to its own pixels).

Both are dev-only. Gate each require behind your own dev check so neither ships.

npm i -D @reticlehq/electron

IPC observation — one line at the top of your preload

require('@reticlehq/electron/preload');

It must come first, before your own require('electron') and before contextBridge.exposeInMainWorld. It wraps ipcRenderer.invoke while that function is still ordinary and writable, so every channel your preload goes on to expose is covered.

Each call then reaches the agent as an ordinary network record — ipc://<channel>, with initiator: "ipc", the duration, and the error the main process actually threw:

reticle_network { ok: false }  →  ipc://todos:archive  ok:false  "archive is not implemented"

Without it, a desktop app's whole backend is invisible: reticle_network reports nothing, which reads as "this app makes no backend calls" rather than "you are blind to all of them". The SDK declares that as a coverage: partial blind spot rather than letting the silence pass, and reticle doctor names the missing line.

A sandboxed preload cannot resolve node_modules. Either bundle the preload (electron-vite and Electron Forge do this by default, and the require is inlined at build time, so sandboxing stays on) or set sandbox: false for an unbundled dev preload.

Screenshots — one line in the main process

const { installReticleCapture } = require('@reticlehq/electron/main');

const win = new BrowserWindow({ ... });
installReticleCapture(win);

reticle_screenshot and reticle_visual_diff now work. It uses webContents.capturePage(), which reads the window's own backing store — correct while the window is behind your editor, correct while backgrounded, and needing no screen-recording permission. Capturing a screen region was deliberately not used: it photographs whatever is on top, which would bank a picture of your editor as a visual baseline.

Safe to call for several windows; the handler registers once and answers for whichever window asked.

{ fullPage: true } is refused, not silently downgraded — capturePage() composites the viewport, and handing back a viewport image for a full-page request would bank a baseline that says nothing about the content below the fold.

Requirements

Apache-2.0