Community

Why Should You Care About Package Metadata Interoperability?

A neutral industry group called the Package Metadata Interoperability Collab Space has formed at the OpenJS Foundation to iterate on the informal standardization of package.json and improve the interoperability of JavaScript package metadata for application developers.

The package.json file is the entry point for nearly all JavaScript applications. It contains descriptive and functional metadata about a project, such as the name, version, and dependencies. The information defined in package.json is used by package managers in a variety of ways such as publishing to a package registry or resolving package dependencies. 

Standards Result in Good Tools

One tool, npm, has shipped with Node.js for years. It has become the default tool to interact with package.json. It is a package management system which is built around package.json. Because it is so popular and has such wide reach, it means that all other developer tools like Yarn, Bun, pnpm, and Deno strive to be compatible with npm. 

Ultimately, this means that everyone is chasing a moving target of the npm informal standard. Luckily, npm is a good actor with good intentions. But it's at best an inefficient way for tools to improve and support a diverse ecosystem. Tool makers are forced to take liberties to make their tools operate but still try to be compatible.

It means everyone is striving towards an undefined standard, and the target can shift unexpectedly.

Pragmatic without Bias and yet Interoperable

Imagine if there was a more clear and all encompassing definition, improved regularly and with wide input, that everyone could base their tooling off of. This informal standard would not depend on Node.js and npm but be set up for the broad community to use. Important note, we’re not proposing a formal standard, but rather an agreed upon framework for technical considerations.

This is what the Package Metadata Interoperability Collab Space wants to build. Our goal and philosophy is to be pragmatic without bias and yet interoperable.

Who is the Package Metadata Interoperability Collab Space?

The OpenJS Foundation is composed of many open source project communities that operate independently but also collaborate together on the Cross Project Council (CPC). Collab Spaces are organized as a part of the OpenJS Foundation and are meant to help community-led efforts reach broader audiences and coordinate stakeholders from across the JavaScript ecosystem. 

The goal of the Package Metadata Interoperability Collab Space is to improve how JavaScript developers define their packages across the ecosystem. Moving into 2024, the group is working to better understand package.json and how developers use it to define their projects.

Current early organizers and contributors include Ethan Arrowood (@Ethan-Arrowood), Darcy Clarke (@darcyclarke), Robin Ginn (@rginn), Luke Karrys (@lukekarrys), Rick Markins (@rxmarbles), Wes Todd (@wesleytodd), Claudio Wunder (@ovflowd).

Yes, so far we're largely Node.js and npm people. Our goal is to be much broader than that. We are just starting outreach (including our first blog) but also wanted to have some level of progress so that new team members will have something actionable to work with right away.

Package Metadata Interoperability Collab Space meeting notes are here, open and public. If you’d like to get involved, just joining our monthly meetings is a great first step.

Different from the Node.js Package Maintenance Group

The participants in the Node.js Package Maintenance Group are currently in the Node.js group, and, like the name implies, are totally focused on Node.js and the Node.js ecosystem. They are not supporting other runtimes like Bun, for example.

Another example is the Web-interoperable Runtimes Community Group (WinterCG) which “aims to provide a space for JavaScript runtimes to collaborate on API interoperability. We focus on documenting and improving interoperability of web platform APIs across runtimes (especially non-browser ones).”

But the “package management” part of our name is important. We’re neither solely web focussed, nor solely server runtime focussed. It’s worthy of its own group.

Tooling is currently being developed in Node.js since that is what current members are most familiar with and will enable us to publish and iterate quickly. We are completely open to additional tooling being developed in other JavaScript runtimes and languages. Please join our monthly discussions if you are interested in contributing!

2024 Goals are Ambitious and Achievable

There are two major areas that we are focusing on in 2024. It will be a big first year for us but we believe it’s achievable and that it will have a wide, positive impact on the JavaScript ecosystem.

  1. Research - We want to have major progress on the ecosystem as it is today, including existing practices and tools, and make sure to include everyone, not just the market share leader. What’s the current status? What are the strengths and what are the weaknesses?
  2. Tooling - Started by the Node package maintenance group, the goal is to build tooling around the research that we're doing as well as influence the research. This is where the rubber hits the road, and we look forward to discussion and debate with all of our collaborators. Tooling is currently being developed in Node.js since that is what current members are most familiar with and will enable us to publish and iterate quickly. We are completely open to additional tooling being developed in other JavaScript runtimes and languages. Please join our monthly discussions if you are interested in contributing!

Please join us! 

The best way to join the Package Metadata Interoperability Collab Space is to join our monthly meeting, held the first Tuesday of each month. The calendar is available on the OpenJS Foundation public calendar here.

You can also join our Slack channel. It’s intended as an open forum, with no set schedule. Join the OpenJS Foundation Slack channel here.

Or you can go to the repo, and add yourself.

Let’s build up package.json together!