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

@tavora/pack

v0.3.2

Published

Packs and publishes Tavora modules from CI with a publisher key file, and reads and checks module zips. Developers publish from Tavora itself.

Readme

@tavora/pack

Packs a built Tavora module into a signed zip and publishes it to Tavora's module catalog, from CI.

To publish by hand, you don't need this package: open Tavora, go to Settings > Developer and press Publish on your module. Tavora packs, signs and uploads it for you.

npx @tavora/pack . --key publisher-key.pem                              # packs into <id>-<version>.zip
TAVORA_PUBLISH_TOKEN=tvp_… npx @tavora/pack publish <id>-<version>.zip --key publisher-key.pem

Set up CI

  1. In Tavora, publish the module once, or claim your id prefix there. A publish token only publishes under prefixes your account already holds.
  2. Under Settings > Developer > Publishing > Publisher keys and CI, export your publisher key to a file and make a publish token.
  3. Store both as secrets in your CI: the key file's text, and the token as TAVORA_PUBLISH_TOKEN.

Keep the key file secret: whoever has it can sign updates in your name. A token works for a year; remove it in Tavora when you don't need it any more.

Build settings

@tavora/pack/vite has the Vite settings a module shares, so vite.config.ts stays short:

import { moduleConfig } from "@tavora/pack/vite";
import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";

export default defineConfig(moduleConfig({ pages: ["index", "overlay"], plugins: [vue()], notices: { VUE: "vue", MODULE: "./LICENSE" } }));

pages are the HTML files in src/ (default ["index"]); notices copy licence files into dist/ as <NAME>-LICENSE.txt, from a package name or a ./file in your project. Also publicDir, dedupe, alias, define and chunkSizeWarningLimit. A project's tsconfig.json can extend @tavora/pack/tsconfig.module.json.

Pack

tavora-pack <module folder> --key <key file> [--out <file.zip>] checks tavora.module.json, takes the manifest, the folder its entry page is in (usually dist/), the icon and the changelog, and writes a zip with a signature of every file. Build the module first.

Publish

tavora-pack publish <file.zip> --key <key file> lists the zip in Tavora's module catalog, where users find it under Browse in the module library. It needs a publish token in TAVORA_PUBLISH_TOKEN, and the key must be linked to your account (Tavora links the keys it makes).

The upload carries the signature over the zip's SHA-256 by the key that packed it, so only you can publish what you packed. Your account's email address gets a mail for every upload.

Every new version is checked automatically. If all is well it is listed at once. If not, or if it's your first module or has new pictures, the command prints Waiting for review with the reasons: the version is uploaded but not listed until a person at Tavora has looked at it, and you get an email either way. That is not an error (the exit code is 0). tavora-pack withdraw <file.zip | sha256> takes a waiting version back; it needs only TAVORA_PUBLISH_TOKEN. What's not allowed: https://docs.mytavora.app/guide/catalog-rules

  • The part of the module id before the first dot (wellbrained in wellbrained.timer) is your prefix. An account holds at most 3; prefixes with tavora and a few other reserved words are refused.
  • A module stays with the key that published its first version. Every new version must be newer, and plain major.minor.patch: pre-releases such as 1.0.0-beta.1 are refused.
  • An account can publish 10 versions a day and store 200 MB of zips.
  • The catalog checks each zip the way Tavora's installer does, and Tavora checks it again on the user's PC.

Link a key file

tavora-pack link <code> --key <key file> links a key that Tavora didn't make, so users see your developer name. In Tavora, press Get a link code under Settings > Developer > Publishing > Publisher keys and CI. The code works once for 10 minutes. The command signs it with your key and sends the key's public half; the private key never leaves your PC.

From code

import { loadExistingKey, packModule } from "@tavora/pack";

const { key } = await loadExistingKey("publisher-key.pem");
const { zip } = await packModule(".", key);

packModule, readZip and verifyFiles are what Tavora's installer uses too. More in the developer docs.