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

readyup

v0.19.0

Published

Run pre-deployment checks to verify environment and configuration

Readme

readyup

Run pre-deployment verification checks against your environment and configuration. Define checklists in TypeScript kits, run them locally or from a remote source, and get clear pass/fail reporting with remediation hints.

Release notes — v0.19.0 (2026-04-24)

Features

  • Add discoverWorkspaces check-util for monorepo-aware kits (#74)

    Adds discoverWorkspaces() to readyup's check-utils, a single helper that enumerates a repo's workspaces across pnpm, npm/yarn, and single-workspace layouts with a uniform return shape. Consumer kits can now answer workspace-iteration questions — including "does this repo have anything publishable?" as discoverWorkspaces({ filter: (w) => w.isPackage }).length > 0 — without bundling their own glob + YAML-parser combination.

Installation

pnpm add -D readyup

Quick start

Scaffold a starter config and kit:

rdy init

This creates two files:

.config/readyup.config.ts — repo-level settings:

import { defineRdyConfig } from 'readyup';

export default defineRdyConfig({
  compile: {
    srcDir: '.readyup/kits',
    outDir: '.readyup/kits',
  },
});

.readyup/kits/default.ts — starter kit:

import { defineRdyKit } from 'readyup';

export default defineRdyKit({
  checklists: [
    {
      name: 'deploy',
      checks: [
        {
          name: 'environment variables set',
          check: () => Boolean(process.env['NODE_ENV']),
          fix: 'Set NODE_ENV before deploying',
        },
      ],
    },
  ],
});

Run the checks:

rdy run

CLI reference

rdy [names...] [options]
rdy <command> [options]

Commands

| Command | Description | | ---------------- | ------------------------------------------------ | | run [names...] | Run checklists (default) | | compile [file] | Bundle TypeScript kit(s) into self-contained ESM | | init | Scaffold a starter config and kit | | list | List available kits |

Run options

| Option | Description | | ----------------------------- | ------------------------------------------------------------- | | --from <source> | Kit source (see kit sources below) | | --file, -f <path> | Path to a local kit file | | --url, -u <url> | Fetch kit from a URL | | --jit, -J | Run from TypeScript source instead of compiled JS | | --internal, -i | Use internal kit directory and infix from config | | --checklists, -c <name,...> | Filter checklists (with --file or --url only) | | --json, -j | Output results as JSON | | --fail-on, -F <severity> | Fail on this severity or above (error, warn, recommend) | | --report-on, -R <severity> | Report this severity or above (error, warn, recommend) |

Kit sources

The --from flag accepts these source types:

| Source | Format | Example | | ---------- | ------------------------- | ------------------------------------------------------- | | Bitbucket | bitbucket:ws/repo[@ref] | --from bitbucket:team/ops | | GitHub | github:org/repo[@ref] | --from github:acme/ops or --from github:acme/ops@v2 | | Local repo | <path> | --from . or --from ../other-repo | | Global | global | --from global | | Directory | dir:<path> | --from dir:/shared/kits |

@ref defaults to main when omitted. Local repo paths look for kits in <path>/.readyup/kits/, while dir: paths are used directly.

List

rdy list                       List internal and compiled kits (owner view)
rdy list --from <path>         List compiled kits at a local path
rdy list --from global         List compiled kits in the global directory
rdy list --from dir:<path>     List kits in an arbitrary directory

Listing from GitHub/Bitbucket sources is not yet supported.

Authoring API

All helpers are type-safe identity functions that provide editor autocomplete without runtime overhead. Import them from readyup.

| Helper | Description | | -------------------------- | ------------------------------------ | | defineRdyConfig | Repo-level config | | defineRdyKit | Kit (collection of checklists) | | defineRdyChecklist | Flat checklist | | defineRdyStagedChecklist | Staged checklist (sequential groups) | | defineChecklists | Array of checklists |

Check utilities

Reusable check functions for common assertions:

import { fileExists, fileContains, hasPackageJsonField } from 'readyup';

| Function | Description | | ------------------------------------------- | ----------------------------------------------------------------------- | | fileExists(path) | File exists at path | | fileContains(path, pattern) | File matches a string or regex | | fileDoesNotContain(path, pattern) | File does not match | | readFile(path) | Read file contents (returns undefined if missing) | | hasPackageJsonField(field, value?) | package.json has a field (optionally matching a value) | | hasDevDependency(name) | package.json has a dev dependency | | hasMinDevDependencyVersion(name, version) | Dev dependency meets minimum version | | readPackageJson() | Parse package.json | | discoverWorkspaces(options?) | Enumerate monorepo workspaces (single-workspace repos return one entry) | | compareVersions(a, b) | Compare semver strings | | runGit(path, ...args) | Run a git command and return trimmed stdout | | expandHome(path) | Expand leading ~ or ~/ to the home directory | | isAtRepoRoot(path) | Path is the top of a git working tree | | isGitRepo(path) | Path is inside a git working tree | | compareLocalRefs(path, refA, refB) | Compare two local refs (discriminated-union result) | | compareRefToRemote(path, ref, remote?) | Compare a local ref to its remote counterpart | | makeLocalRefSyncCheck(options) | Check factory: verify two local refs match | | makeRemoteRefSyncCheck(options) | Check factory: verify a ref matches its remote counterpart |

Discovering workspaces

discoverWorkspaces() returns a uniform Workspace[] that collapses pnpm, npm, and yarn monorepo conventions — and single-workspace repos — into one iteration shape. Every entry includes dir (relative to cwd; '.' for a single-workspace repo), absolutePath, name, isPackage (true when package.json.private !== true), and the parsed packageJson.

Common filter pattern — get all publishable workspaces:

import { discoverWorkspaces } from 'readyup';

const packages = discoverWorkspaces({ filter: (w) => w.isPackage });

Note: pnpm-workspace.yaml is read by a minimal block-sequence parser; configs using YAML anchors, flow sequences, negation patterns, or other non-trivial features will raise a clear error with a pointer to file an issue.

License

MIT