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

@moonbase.sh/cli

v0.1.1

Published

Publish product releases to Moonbase.sh from the command line or a CI job

Readme

@moonbase.sh/cli

Publish product releases to Moonbase from the command line or a CI job, in one command.

export MOONBASE_ENDPOINT=https://acme.moonbase.sh
export MOONBASE_API_KEY=mb_...

npx @moonbase.sh/cli release moon-terminal v1.4.0 "dist/Moon Terminal.dmg" "dist/Moon Terminal Setup.exe" --notes-file NOTES.md --publish

That uploads both files, creates release 1.4.0 of the product moon-terminal from them, and publishes it. It needs Node.js 20 or later.

MOONBASE_ENDPOINT is your account's address and MOONBASE_API_KEY an API key. Both are under Account settings > Developer in Moonbase. Every command also takes them as --endpoint and --api-key, which win over the variables. Keep the key secret: in CI, put it in a secret rather than in the workflow file. Prefer the variable to --api-key on a machine you share, since other users can see a command's options while it runs, and your shell history keeps them.

Commands

release <product-id> <version> <file...>

Uploads the files and creates the release from them. Before it uploads anything, it checks that the product exists, that the release does not (unless you pass --add) and that every file is there.

  • The version is MAJOR.MINOR.PATCH. A leading v is dropped, so a Git tag like v1.4.0 works as it is.
  • Each download is named after its file.
  • A file's platform is guessed from its extension (.dmg and .pkg are Mac, .exe and .msi Windows, .deb, .rpm and .AppImage Linux), then from a word in its name (mac, win, linux), and is Universal otherwise. Its architecture is guessed from a word in its name (arm64, x64, x86_64, universal and the like) and is left out otherwise. The command lists what it guessed before it uploads. --platform and --arch set them for every file instead.
  • A file larger than 64 MiB is sent in parts, four at a time, and a part that fails is retried.

| Option | | |---|---| | --notes <text> | The release notes | | --notes-file <path> | Read the release notes from a file | | --platform <name> | Universal, Windows, Linux, Mac, iOS or Android | | --arch <name> | Universal, X86, X64, Arm or Arm64 | | --publish | Publish the release, so customers can download it. Without it the release stays unpublished. | | --add | If the release exists, add the files to it. A file with the same name, platform and architecture as one already there replaces it. | | --json | Print the release as JSON | | --endpoint <url> | Your account's address, instead of MOONBASE_ENDPOINT | | --api-key <key> | An API key, instead of MOONBASE_API_KEY |

publish <product-id> <version>

Publishes a release, so customers can download it. Takes --json, --endpoint and --api-key.

upload <file>

Uploads one file and prints its key, for adding it to a release through the API or @moonbase.sh/api. Takes --endpoint and --api-key.

Progress and messages go to stderr, so stdout holds only the key or, with --json, the release. The exit code is 0 when the command worked, 1 when it failed and 2 when it was run the wrong way.

GitHub Actions

Release when a version tag is pushed:

on:
  push:
    tags: ['v*']

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: ./build.sh # puts the installers in dist/
      - run: npx @moonbase.sh/cli release moon-terminal ${{ github.ref_name }} dist/* --publish
        env:
          MOONBASE_ENDPOINT: https://acme.moonbase.sh
          MOONBASE_API_KEY: ${{ secrets.MOONBASE_API_KEY }}

When each platform builds on its own runner, let each job add its files with --add, and publish once they all have:

jobs:
  build:
    strategy:
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - run: ./build.sh
        shell: bash
      # bash, so `dist/*` is expanded on Windows too.
      - run: npx @moonbase.sh/cli release moon-terminal ${{ github.ref_name }} dist/* --add
        shell: bash
        env:
          MOONBASE_ENDPOINT: https://acme.moonbase.sh
          MOONBASE_API_KEY: ${{ secrets.MOONBASE_API_KEY }}

  publish:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - run: npx @moonbase.sh/cli publish moon-terminal ${{ github.ref_name }}
        env:
          MOONBASE_ENDPOINT: https://acme.moonbase.sh
          MOONBASE_API_KEY: ${{ secrets.MOONBASE_API_KEY }}

Jobs that finish at the same moment are fine: when Moonbase turns one job's change away because another's landed first, the command sends it again. A rerun of a job replaces the files it added before, since they have the same names.

To keep a workflow on a version you have tried, pin it: npx @moonbase.sh/[email protected] release ....