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

@flashyos/holding

v0.1.0

Published

holding/1 — a log of what happened to the positions an office holds. Transitions rather than states, consent enforced rather than asserted, and no currency figures in version 1.

Readme

@flashyos/holding

holding/1 — a log of what happened to the positions an office holds.

Transitions rather than states. The current state of a position is derived from its log and never asserted, which is the whole design: a table of states can be edited, and a log can only be appended to.

npm i @flashyos/holding

Or take the vendored emitter and run it with nothing installed at all:

curl -O https://unpkg.com/@flashyos/holding/vendor-holding.mjs
node vendor-holding.mjs board

What it is for

An office that publishes only its wins has published a track record, and every reader knows it. This format exists so that "we do not abandon a position when it goes wrong" can be a column somebody counts rather than a sentence somebody writes.

Three rules carry that, and none of them can be relaxed by a caller:

recorded may not precede at. The gap between when a thing happened and when it was written down is published, per entry and as a median. A register that records good news the same week and bad news eighteen months later says so in a number, and no amount of copy improves it.

A cross-entity transition is invalid without consent. Moving a position between entities under common control requires a consent block naming every affected party, a basis each of them also holds, and a date that does not follow the event — consent afterwards is ratification, and the format will not let the two be written as the same thing. "Restructured with full consent and alignment" stops being a sentence anybody can write and becomes a document somebody must hold.

No currency figures in version 1. Publishing marks is a regulated communication in most jurisdictions an office of this kind operates in; a distribution is harder to flatter than a multiple; and a money column would be the only column anybody read. Fifteen field names are refused by name. See SPEC.md §6.

The seven states

committed · funded · held · impaired · restructured · realised · written-off

impaired and written-off are the two a track record leaves out, and a log with no path to either will be read as selective rather than as fortunate.

The metrics, and the one rule about them

import { metrics } from '@flashyos/holding';

metrics(fragment).recovery;
// { everImpaired: 12, recovered: 7, ratio: 0.583, writtenOff: 5, medianLagDays: 4 }

recovery is one object rather than five fields on purpose. It may not be published without its denominator, the write-off count and the recording lag, because it is a number the publisher can move — unlike a countersignature ratio, which only somebody else can move — and a number you can move is worth publishing only beside the numbers that would expose you moving it.

API

| | | |---|---| | checkFragment(doc) | Every problem, not the first. Returns [code, subject, message][]. | | derive(fragment) | Current state per position, plus whether it was ever impaired. | | metrics(fragment) | The counts, the recovery object, and the median hold. | | project(fragment) | The public projection. Positions with at least one public transition, and only their public transitions. | | STATES TERMINAL TIERS FORBIDDEN | The vocabulary. |

Discovery

| Path | Read by | |---|---| | /.well-known/holding.json | Anyone fetching from a domain. | | holding.fragment.json | A merge that reads checkouts. |

A consumer must fetch over https, apply a timeout and a size cap, follow redirects only within the same registrable domain, and must not treat an unreachable publisher as one that published nothing.

The vendored copy

vendor-holding.mjs imports nothing but node: builtins and is copied whole into whichever repository adopts the format. src/vendor.test.ts runs it and the TypeScript checker over the same corpus and fails on any disagreement about a verdict — never by comparing constants, because two lists of one rule is how a checker ends up disagreeing with its own specification.

Apache-2.0.