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

@tomradex/pet

v0.27.0

Published

ctx.pet — switchable embedded or draggable desktop task-state companion — declarations for full-mode plugins; Tomrade provides the code at run time

Readme

@tomradex/pet

This optional Cordis plugin owns ctx.pet and the complete pet lifecycle. Its settings section chooses embedded or desktop; setting enabled hides the feature without unloading the settings card, while the Plugins-sheet switch unloads the service, section, contribution, channels, listeners, timers and desktop window.

The plugin listens to the typed main-process agent/event stream. Every turn is a new run, thinking until its first output (a text delta, emitted block, card or tool call) and working from then until it ends; a pending question or an asked run is waiting; a turn that ends shows success for 30 seconds and then rests at idle, while error stays until the thread's next turn — the pet reflects the turn, not the whole thread; cancellation is idle at once. Both the embedded stage and the desktop pet show the thread the assistant panel is showing — the panel reports it through agent.showing — so an old thread still waiting for an answer never holds the pet; leaving the project keeps the last one.

The desktop pet stays where it is put: dragging its opaque pixels moves the window, and a window reopened for a new size or setting returns to the last spot in this session. prefers-reduced-motion holds each image's first frame.

Pets and their images

Each mood is one still or animated image (GIF, WebP, APNG, PNG, JPEG or AVIF), played with its own frame timings by an ImageDecoder player — the renderer's for the embedded stage, assets/desktop.html for the desktop window. The image's content box is fitted to 90% of the stage height, bottom-aligned, so every state fills the stage alike whatever its canvas size.

The built-in pet (assets/<mood>.webp, memes cropped to their content) is profile default: it can't be changed or removed, so the user can always go back to it. Settings › Pet lets the user make more from their own images; a profile's state without an image shows the built-in pet's. Profiles live under config.profilesDir (${userData}/pet-profiles in the app), one folder per profile with profile.json and the original image files, plus profiles.json naming the one in use. Nothing there is synced. The renderer measures an image's visible area when it is chosen and sends it as box; the main process reads the type from the bytes and caps each image at 8 MB.

The Electron implementation forwards mouse movement through ignored windows on macOS and Windows. The pet document alpha-tests its current canvas frame: transparent pixels pass through, while opaque cat pixels are interactive and start a pointer drag, sent to the plugin as move messages that it applies with setPosition. Electron does not provide forwarded moves on Linux, so the tightly sized window stays interactive there. Native Wayland does not allow programmatic placement of top-level windows; the surface host reports that capability as unavailable and the canvas falls back to a native drag region.