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

@michaelthielemann/kestrel-insights

v5.8.1

Published

insights@1: the instance manifest (modules, config schemas, steps, pipelines, triggers) and live per-process run statistics from the core's observer hook.

Readme

insights/default

insights@1: one view of the running instance. manifest() is the core's kestrel.describe() (modules with version, contracts, config schema and variables, steps with their descriptions, pipelines with step order, triggers) — static, computed once; stats() aggregates the core's run observer in this process: count, failed (every non-ok outcome), errors (5xx), p50/p95 ms per pipeline and per step spec, active runs, uptime, event-triggered runs per event name, and a ring buffer of the last failed runs (recentFailures, newest first: time, run id, pipeline, trigger, status, duration, code, step and the message the caller received — truncated, never a stack). The module hooks in through the core's attach lifecycle hook and detaches on stop(). Numbers are per process and start at zero on every boot. Every config variable in the manifest carries its effective value: value is what the config sets, otherwise the default, null when nothing applies, and status says which of the two it is. The value is a JSON snapshot — functions, class instances and Buffers become type labels, long strings and large arrays/objects are cut with a marker. A secret is never in it: redacted: true with value: null covers everything the schema marks secret and everything whose key name or value looks like a credential, nested keys inside a shown value included ("[redacted]"). A module author marks a secret with .describe("secret") on the zod field (the core's SECRET constant); a config schema written as JSON Schema marks it with writeOnly: true, format: "password" or x-secret: true. Because values are on show, insights.readManifest belongs behind a login and insights.read — as in the example pipelines below. Config: { recentFailures } — how many failed runs to keep (default 50, 0 turns the buffer off). Steps: insights.readManifest (adds generatedAt), insights.readStats; both write result and read nothing — guard them with authn.requireUser and authz.require:insights.read in the pipeline. Not included: routes (the consumer's kestrel.config.ts wires them), persistence or time series (OpenMetrics/Prometheus is the way there), ratelimit buckets (ratelimit stays [] until a ratelimit contract exists), numbers across processes.

Generated from the manifest

@michaelthielemann/kestrel-insights – module insights/default: provides insights@1.

| Config | Type | Required | Default | |---|---|---|---| | recentFailures | integer | no | 50 |

| Step | Summary | Reads | Writes | Input | Output | Errors | |---|---|---|---|---|---|---| | insights.readManifest | The static manifest of this instance: modules, contracts, config schemas, steps, pipelines, triggers | – | result | – | { generatedAt: number, core: object, contracts: string[], modules: object[], steps: object[], pipelines: object[], triggers: object, … } | – | | insights.readStats | Live counters of this process: runs, pipelines, steps, events, and the most recent failed runs | – | result | – | { generatedAt: number, process: object, runs: object, pipelines: object[], steps: object[], events: object[], ratelimit: object[], recentFailures: object[], … } | – |

Pipelines in examples/minimal using these steps:

  • insightsManifest (GET /admin/insights/manifest): authn.requireUser → authz.require:insights.read → insights.readManifest
  • insightsStats (GET /admin/insights/stats): authn.requireUser → authz.require:insights.read → insights.readStats