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

@nuasite/cms-sidecar

v0.56.4

Published

Thin standalone Bun HTTP server exposing @nuasite/cms-core over /cms/v1 — runs next to the dev server, decoupled from the site's version.

Readme

@nuasite/cms-sidecar

Thin standalone Bun HTTP server exposing @nuasite/cms-core over /cms/v1. It runs next to a site's dev server rather than inside it, so the CMS version is decoupled from the site's Astro version.

bunx @nuasite/cms-sidecar serve --port 4321 --root /path/to/site [--content-dir src/content]

It prints cms-sidecar listening on :<port> once ready, and answers a GET /health liveness probe with { ok, coreVersion, root }.

The typed client for this contract is @nuasite/cms-client; the wire shapes come from @nuasite/cms-types.

Media storage

The media routes need an adapter, selected by CMS_MEDIA_ADAPTER (contember | s3 | local | none) — see src/media-from-env.ts for the per-adapter environment variables. Without one, every /media route answers 501 unsupported.

GET /cms/v1/media

| Query | Meaning | | ---------------------- | ---------------------------------------------------------- | | limit | Page size, default 50, capped at 1000. | | cursor | Opaque continuation token from the previous page. | | folder | List this subfolder instead of the media root. | | includeProjectImages | Merge the project image scan into the listing (see below). |

By default the response is the storage adapter's own listing: { items, folders, hasMore, cursor? }.

?includeProjectImages

Sites accumulate images that were never uploaded through the CMS — an agent commits them under public/ or src/. This flag merges a scan of those directories into the listing, so the media picker offers everything the site actually has.

  • Accepted spellings: the bare flag, =true, =1. =false / =0 turn it off. Anything else is a 400 — a silently ignored =TRUE would drop the scan without a word.
  • Root only: it is refused together with ?folder=, because the scan has no folder structure.
  • The adapter's uploads directory is excluded from the scan (derived from MediaStorageAdapter.staticFiles.dir), so an upload is never listed twice.
  • The two sources are paginated in phases, never interleaved: the adapter is drained first, then the scan tops each page up. Following cursor yields every item exactly once, in the scan's stable order (filename, then URL).
  • folders comes from the adapter and is carried through the cursor, so it stays populated on every page.
  • The cursor is self-identifying: following it without the flag is a 400 rather than an empty page.
  • Cost: the scan is unpaginated by nature, so it re-walks public/ and src/ on every page that reaches the scan phase.

Advertised to clients as the media.project-images capability in GET /cms/v1/project.