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

shipreal

v2.0.0

Published

SDK and CLI for the public ShipReal course API: search the curriculum, read a module, read pricing. No authentication.

Readme

shipreal

SDK and CLI for the public ShipReal course API. Search the curriculum, read a module, read pricing.

No API key. No account. No signup. It is public read-only reference data about one course, served from the edge. If something asks you for a ShipReal credential, it is not us.

npm install shipreal

Library

import { ShipReal } from "shipreal";

const sr = new ShipReal();

// Does the course cover caching?
const { data } = await sr.search("caching");
//=> [{ slug: "24-caching-strategies", title: "Caching Strategies", part: "Part 7: ...", chapters: 12, ... }]

// One module, by slug or by title fragment
await sr.module("observability");

// Everything, pagination handled for you
for await (const m of sr.modules()) console.log(m.title);

// What does it cost? Two regional prices are live at once.
await sr.pricing();                   // both
await sr.pricing({ region: "il" });   // one, already flattened

// Several reads in one round trip
await sr.batch([
  { id: "caching", path: "/modules?q=caching" },
  { id: "price", path: "/pricing" },
]);

// Natural language, or the same thing streamed
await sr.ask("how do I make deploys safe");
for await (const ev of sr.askStream("caching")) console.log(ev.event);

CLI

npx shipreal search caching
npx shipreal module observability
npx shipreal pricing --region il
npx shipreal ask "how do I make deploys safe"

Every command takes --json, because the reason a CLI earns a place in an agent's toolbox is that its output pipes into something else without being scraped:

npx shipreal search --all --json | jq '.[] | select(.chapters > 12) | .title'

--sandbox routes at frozen fixture data, which is what you want in a test: the live catalogue moves whenever a module is added, and a suite that asserts on real data breaks for reasons that have nothing to do with your code.

Errors

Non-2xx responses throw ShipRealError carrying the server's RFC 9457 problem details. Branch on err.type, which is stable, rather than on the message, which is prose.

import { ShipReal, ShipRealError } from "shipreal";

try {
  await new ShipReal().module("kubernetes");
} catch (err) {
  if (err instanceof ShipRealError && err.status === 404) {
    // The course does not cover it under that name. Say so; do not guess.
  }
}

What there is no method for

Buying. Payment runs through a hosted checkout, and there is no endpoint that takes money or creates an account. An agent helping someone enrol should hand them the link and let them complete it themselves. That is a deliberate limit, not a gap waiting to be filled.

Other languages

The same client, same surface, in this repository:

| | | | | --- | --- | --- | | JavaScript | npm install shipreal | src/ | | Python | pip install shipreal | python/ | | Ruby | gem install shipreal | ruby/ | | Go | go get github.com/mluggy/shipreal-dev/go/v2 | go/ |

Each is standalone and dependency-free. The Go module is a submodule, so its git tags carry the directory prefix (go/v1.0.0) even though the version you request does not (@v1.0.0).

Other surfaces

The same three capabilities are also available without this package:

| | | | --- | --- | | REST | /api/v1, OpenAPI 3.1 | | MCP | /mcp — search_curriculum, get_module, get_pricing | | MCP | /mcp/product — quote_order, create_enrollment_link, check_enrollment_channel | | Natural language | /ask (NLWeb, JSON or SSE) | | Markdown | every page has a twin: Accept: text/markdown, or ?mode=agent | | Bulk | modules.jsonl |

Install the skills into your own agent:

npx skills add mluggy/shipreal-dev

This repository is also an Agent Plugin: the manifest is plugin.json, the MCP server is configured in mcp.json, and the five skills live under skills/, mirrored at /.well-known/agent-skills/. Working notes for AI coding agents are in AGENTS.md.

Rate limit

600 requests a minute per address, counted per edge isolate. Every response reports RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and a 429 carries Retry-After. Because the count is per isolate rather than global, treat those numbers as a pacing signal rather than a guarantee.

Tests

npm test

They hit the live API on purpose: it is public, free and read-only, so there is nothing to mock and a mock would only prove that the mock matches itself. They skip rather than fail when the network is unavailable, and they assert on shape and invariants rather than on counts or prices, which change legitimately.

About

ShipReal is a 38 module course on production engineering for people who ship software with AI assistance: shipreal.dev.

This repository is the client only. The course, the site and the API implementation live elsewhere.

MIT licensed.