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

@liris-tech/meteor-private-package-linker

v0.1.0

Published

Creates the necessary symlink structure for interdependent private Meteor packages

Readme

[WIP - not usable yet] meteor-private-package-linker

Creates the symlink structure for interdependent private Meteor packages.

Problem statement

The way to encapsulate Meteor dependent code in Meteor projects is by using Meteor packages and publishing them to Atmosphere.

Sometimes, however, you need to keep business critical code in Meteor private packages. This can be done by putting those into the packages/ directory (by default) of the Meteor project.

The problem arises when those private packages depend on each other. Dependent packages need to be recursively symlinked into a packages/ directory inside the parent package as shown below.

Example: Meteor project containing 3 private packages A, B and C. A depends on both B and C. And B depends on C.

your/meteor/project
 ├── .meteor
 ├── package.json
 ├── [...]
 └── packages
      └── A
      │   ├── [...]
      │   ├── package.js
      │   └── packages
      │        ├── B # ---------------------- symlink to packages/B
      │        │   ├── [...]
      │        │   ├── package.js
      │        │   └── packages
      │        │        └── C # ------------- symlink to packages/C
      │        │            ├── [...]
      │        │            └── package.js
      │        └── C # ---------------------- symlink to packages/C
      │            ├── [...]
      │            └── package.js
      ├── B # ------------------------------- symlink to packages/B
      │   ├── [...]
      │   ├── package.js
      │   └── packages
      │        └── C # ---------------------- symlink to packages/C
      │            ├── [...]
      │            └── package.js
      └── C
          ├── [...]
          └── package.js

Doing this manually is error prone and cumbersome.

meteor-private-package-linker solves this problem.

Usage

cd /your/meteor/project
meteor npm install meteor-private-package-linker

In package.json add the following:

{
  ...
  "scripts": {
    ...
    "meteorlink": "node node_modules/meteor-private-package-linker/index.js --watch && meteor"
    "meteorlink-no-watch": "node node_modules/meteor-private-package-linker/index.js && meteor"
  }
}

The purpose of meteorlink is to watch for relevant file changes and update the symlinks on the go.

As such, for building the Meteor project, instead of simply meteor, you should now use:

# in development (with file-watch, so that symlinks are updated seemlessly)
npm run meteorlink

# in production (without file-watch)
npm run meteorlink-no-watch

# notice that the usual command-line arguments passed to meteor also work here
npm run meteorlink-no-watch --production

Advanced

The part below is useful but not mandatory.

Meteor forces private packages to be at the top-level of the project's packages/ directory.

With meteor-private-package-linker, you have the freedom to organize your packages as you see fit by setting the METEOR_PRIVATE_PACKAGE_DIRS env variable. For example, with the following structure:

your/meteor/project
 ├── .meteor
 ├── package.json
 ├── [...]
 └── my-private-packages
      ├── invoicing
      │    ├── A
      │    │   └── [...]
      │    └── B
      │        └── [...]  
      └── clients
           └── C
               └── [...]

you would set METEOR_PRIVATE_PACKAGE_DIRS to your/meteor/project/my-private-packages.

Executing meteorlink will then generate the following output:

:bulb: You can share private packages among several meteor projects:

your/meteor/project
 ├── .meteor
 ├── package.json
 └── [...]
your/other/meteor/project
 ├── .meteor
 ├── package.json
 └── [...]
my-private-packages-shared-among-several-projects
 ├── invoicing
 │    ├── A
 │    │   └── [...]
 │    └── B
 │        └── [...]  
 └── clients
      └── C
          └── [...]

:bulb: You can add /packages to the .gitignore of your meteor project.