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

@profullstack/crawlproof

v0.2.1

Published

What the fleet costs and what it returns: a live terminal dashboard over CrawlProof traffic, ad delivery and CoinPay banking.

Readme

@profullstack/crawlproof

What the fleet costs and what it returns, in a terminal.

npm install -g @profullstack/crawlproof
crawlproof dashboard

Five live screens over three feeds that are not otherwise in the same place: CrawlProof's tracker for who arrived, its ad network for what was delivered, and CoinPay for what the bank actually did.

| Screen | Answers | | --- | --- | | ROI | Monthly burn against revenue, cost per reader, break-even | | Traffic | Every site on the account, ranked, with its score and its share of the cost — open one for its own numbers | | Ads | Delivery as advertiser and as publisher, and ad-driven arrivals | | Money | Earnings, bank position, invoices, income vs spending by month | | Spend | Who we pay, largest first, and burn by category |

15 or the left/right arrows switch screens, w cycles the window, b cycles humans / all / bots, r refreshes, ? explains the arithmetic, q quits.

Traffic, ads and CoinPay each show an animated spinner while fetching, with domain/business progress and a visible completion or failure result. Pressing r during a fetch queues one more refresh; changing the window during a fetch also queues the newly selected window. The previous snapshot stays visible until collection finishes.

Ads get a 60-second request deadline and one automatic retry for timeouts, transient errors or partial responses. If that still fails, the dashboard keeps the last successful ads data for the same finance window and displays its saved timestamp. A different window never inherits those cached figures.

One property at a time

On Traffic, / pick a site and Enter — or a click on the row — opens it. That screen is only that domain: its pageviews, visits, humans against bots, AI referrals and where they arrived from; the burn prorated onto it by both denominators; its ad earnings and spend, joined by project and by where the campaign points; and CoinPay payment volume, payment count and commission for businesses whose names match the domain (ignoring www). Analytics are fetched separately for each business, so another property's earnings stay out of this view. Unmatched businesses and failed requests show with a reason. Esc, or 2 comes back to the list.

Shared bank costs are estimates allocated by traffic share. CoinPay volume and payment count cover the labeled bank window; commission is prorated onto the traffic window. Ad earnings, spend and impressions cover the labeled ad window.

The risk-to-viral score

Every property gets a score out of 100, shown as a column on the list and taken apart on the domain screen. It is arithmetic over numbers already on the screen, not a model:

score = 100 × viral × (1 − risk/2)

viral = momentum .40 + discovery .30 + humanity .20 + money .10
risk  = volatility .40 + concentration .30 + bot dependence .20 + unmonetised .10

| Component | What it is | | --- | --- | | momentum | Human visits in equal-sized recent and earlier halves of the window, skipping the middle bucket when needed. Flat scores 0.5, doubling scores 1. | | discovery | Share of arrivals through search, social, an AI assistant, an ad or another site's link. Direct traffic, self-referrals and localhost referrals do not count as discovery; bots-only windows leave it unscored. | | humanity | Humans over humans plus bots, from an unfiltered read — never from a filtered one, whose bot column is zero by construction. | | money | Revenue per 1,000 human visits against a $2 target. | | volatility | Coefficient of variation of the human series. Scale-free, so a small site is not penalised for being small. | | concentration | The largest single arrival channel's share. An even spread is not a risk; one channel being everything is. | | bot dependence | 1 − humanity. | | unmonetised | 1 − money. |

A component with no data behind it is dropped and its weight redistributed, never counted as a zero, and the domain screen prints the raw figure under each one. A trailing ~ marks fewer than 25 human visits in the window — too small a sample to lean on. A site whose stats call failed is not scored at all. Missing revenue leaves money and monetisation risk unscored; observed zero revenue counts as unmonetised. Higher scores mean more potential under this heuristic, not a probability of going viral. The domain view labels scores of 60+ as Promising, 35–59 as Worth watching, and lower scores as Limited signal; small samples are labeled Early signal.

s cycles the order: score, visitors, pageviews. --sort=score starts there. --json carries .sites[].score with every component, for a script.

Two rules the numbers keep

Self-deal is not revenue. Where an account advertises on its own slots, ad spend and ad earnings are one dollar moving between two pockets. They are shown under Internal and counted as neither cost nor revenue.

Personal money is not business cost. A bank feed carries groceries next to servers, so cost is the business scope only — joined from each transaction's account to that account's scope.

Everything is normalised to a monthly rate and then prorated onto the traffic window, because burn is a rate: the traffic side can be asked for an hour while the bank side only answers in weeks.

The dashboard also reports what it cannot know. A site that did not answer is missing rather than zero. A vendor list built from one page of a longer ledger says so. A fleet whose visits run far above its pageviews — a "visitor" is any non-crawler hit, which on a site with a machine-readable endpoint runs orders of magnitude above pages anyone read — says that next to the number, and offers the per-pageview figure instead.

Commands

crawlproof dashboard [--range=1h|4h|1d|1w|1m] [--who=humans|bots|all]
                     [--interval=60] [--sites=a.com,b.com] [--concurrency=8]
                     [--sort=score|visitors|pageviews] [--no-coinpay] [--json]
crawlproof stats [site] [--range=1d] [--who=humans] [--json]

--json prints the same snapshot the screens render, for a script or a box with no terminal. Aliases for dashboard: roi, tui.

Auth

| | | | --- | --- | | CRAWLPROOF_TOKEN | API token (crp_…) from Social → API tokens. Also read from the token field of ~/.crawlproof.json. --token wins. | | CRAWLPROOF_SITE_URL | API base, default https://crawlproof.com. | | COINPAY_SESSION_TOKEN | CoinPay merchant JWT for the money screens. Defaults to jwtToken in ~/.coinpay.json, which coinpay auth login writes. |

Without a CoinPay session the traffic and ads screens still work and the money panels say what is missing, rather than showing zero.

Needs Node 22.6 or newer, and a terminal for the dashboard. --json needs neither.

License

MIT

Copy summaries as Markdown

Click ⧉ MD on a summary pane or the feed-status strip. Tab / Shift+Tab focus controls; Enter / Space copies the focused summary. Copied Markdown includes the screen/domain, displayed range, CoinPay window, snapshot time, stale-source warnings and source errors. The status export names failures such as CoinPay payouts instead of just reporting the unavailable-source count. Data rows are excluded. Clipboard delivery uses the terminal's OSC 52 support, including over SSH.