npm.report is a supply-chain trust multi-tool for npm orgs. For a given org or orgs, it looks up trust signals on each package's latest release (none, provenance, trusted publishing, staged publishing), all versions published manually, and all maintainers of org packages who aren't org members. Reports are shareable and exportable and can be set to automatically update daily in order to track progress and trends over time.
Not affiliated with or endorsed by npm, Inc. This is a free, open-source project for the community.
More specifically, it offers four report types:
- Package trust level: trust status of each in-scope package's
latestrelease. manual: versions published by non-bot accounts in the selected window.external: current package maintainers who are not listed as org members.- User publish history: versions a specific npm user personally published.
Users and organizations should use modern, secure npm publishing mechanisms. They may have many (perhaps hundreds) of packages to audit, prioritize, and keep tabs on. Although the necessary information exists, there is no official tooling that makes this easy. npm.report attempts to fill that gap.
- Enter up to 5 npm orgs.
- By default, the audit scans all org packages. Select "Limit to recent packages" to use a recency window if needed.
- Select reports:
package trust level,manual,external, or any combination. Package trust level andmanualare selected by default. - For
manual, adjust bot or CI publisher account names to exclude. The default exclusion list starts withGitHub Actions. (Please feel free to submit a PR to add more known bot identifiers.) - For
external, runnpm org ls <org> --jsonlocally while authenticated and paste the output. npm package maintainers are public, but org membership is private, so the app needs your authenticated member list to compare them. The list is used only for that audit and is not persisted; derived external findings are included in the saved report. - Run the audit. Results render as sortable tables with JSON copy and CSV download actions.
- The server saves each completed run automatically.
/report/:idpreserves that exact snapshot;/orgs/:orgsalways shows the latest snapshot for a normalized org set. - For all-package package trust reports, select "Track daily" to generate one automatic trust snapshot per day. The Tracked orgs page shows every tracked org set, its latest trust distribution, and a link to the latest report.
- Vite, Svelte 5, and TypeScript provide the static client. It submits audits to the server and renders the streamed progress and results.
- Audits run server-side in Netlify edge functions and stream to the browser over SSE (
POST /api/audit-streamandPOST /api/user-publishes-stream). The browser does not compute the audit; because the server does, the saved report is authoritative. - npm is fetched directly from the server (
registry.npmjs.org,api.npmjs.org, andnpm.antfu.dev). - Daily tracking reruns the all-package package trust report for opted-in org sets from an hourly Netlify scheduled background function that picks up daily work that is due.
- Report links and daily tracking are the only durable stateful features. The audit stream saves the
completed
AuditResultplus display metadata to Netlify Database as part of the run;/report/:idrenders that snapshot read-only, while/orgs/:orgsresolves the latest all-package trust snapshot without changing the stable URL./trackedsummarizes the latest snapshot for every enabled daily schedule. - Resumable audit jobs retain non-sensitive request metadata, progress, and results temporarily; hourly cleanup removes job records after they are two hours old. Private org membership input is not written to the job or report records.
externalneeds manually pasted membership output because org membership is private and can change.- "Manual" means the version's
_npmUserwas not in the configured bot list; npm does not distinguish a human login from any of that account's automation tokens. - Scoped package download counts are intentionally fetched sequentially with a 500 ms delay because
api.npmjs.orgrate-limits aggressively.
See CONTRIBUTING.md to run this app locally and contribute. See AGENTS.md for agent-optimized
guidance.