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

@forge-dashboard/sdk-node

v3.10.0

Published

Node/TypeScript client for forge-dashboard's REST API, generated from its OpenAPI spec.

Readme

forge-dashboard-sdk-node

CI npm Codecov docs License: MIT

A Node/TypeScript client for forge-dashboard's REST API, generated from its OpenAPI spec with openapi-typescript and openapi-fetch. It saves you from hand-rolling HTTP requests and retries against the API yourself.

Full API reference: https://alrayyes.github.io/forge-dashboard-sdk-node/

Requirements

  • Node.js 20+ or Bun 1.1+ — anything with a native fetch.
  • A running forge-dashboard instance.
  • A personal API token for that instance (see "Authentication" below) — every endpoint except /healthz and /api/version needs one.

Installation

bun add @forge-dashboard/sdk-node
# or: npm install @forge-dashboard/sdk-node

Alternative registry: GitHub Packages

Every release also publishes to GitHub Packages under @alrayyes/forge-dashboard-sdk-node — the same code, a different scope, because GitHub Packages' npm registry requires a package scoped to the repo owner rather than the forge-dashboard npm org. Worth it if you're already authenticated to GitHub (CI in another of your own repos, say) and would rather not hold a separate npmjs.com credential just to install this one package.

Add a .npmrc pointing that scope at GitHub Packages:

@alrayyes:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}

then install the scoped name instead:

npm install @alrayyes/forge-dashboard-sdk-node

Authentication

forge-dashboard authenticates browsers with passkeys (WebAuthn) and a session cookie, but its spec documents a real headless alternative: a personal API token, generated from the dashboard's own Settings page (POST /api/tokens, signed in as yourself first) and sent as Authorization: Bearer <token> on every request after. Pass it to createForgeDashboardClient or set FORGE_DASHBOARD_TOKEN in the environment:

import { createForgeDashboardClient } from "@forge-dashboard/sdk-node";

const client = createForgeDashboardClient("https://dashboard.example.com", {
  token: process.env.FORGE_DASHBOARD_TOKEN,
});

A token is revocable from Settings at any point; there's nothing in this SDK to refresh one automatically once it's gone.

Usage

GET /api/version needs no token and is a good first call to prove the client reaches the server at all. The client is a typed openapi-fetch instance, so every operation is client.GET(path, ...) / client.POST(path, ...), returning { data, error, response }:

import { createForgeDashboardClient } from "@forge-dashboard/sdk-node";

const client = createForgeDashboardClient("https://dashboard.example.com");

const { data } = await client.GET("/api/version", {});
console.log("server version:", data?.version);

Fetching your own dashboard needs a token, and demonstrates typed error handling:

import {
  ApiError,
  createForgeDashboardClient,
  decodeError,
} from "@forge-dashboard/sdk-node";

const client = createForgeDashboardClient("https://dashboard.example.com", {
  token: process.env.FORGE_DASHBOARD_TOKEN,
});

const { data, error, response } = await client.GET("/api/dashboard", {});
if (error) {
  const apiErr = decodeError(response, error);
  if (apiErr instanceof ApiError && apiErr.statusCode === 401) {
    throw new Error("token expired or invalid");
  }
  throw apiErr;
}
for (const pr of data.pullRequests) {
  console.log(`${pr.repo}#${pr.number}: ${pr.title} (${pr.ci})`);
}

Every other operation follows the same client.GET/client.POST/... pattern. Use decodeError to turn any failed response into a @forge-dashboard/sdk-node ApiError uniformly, as shown above.

The client retries a 429 or 5xx response with exponential backoff and jitter (honoring a server-sent Retry-After), and never retries any other 4xx. Tune it with the retry option, or swap the underlying fetch entirely with the fetch option.

Regenerating the types

See CONTRIBUTING.md — the generated types are pinned to a specific forge-dashboard commit and shouldn't drift from it silently.

Contributing

See CONTRIBUTING.md for building, testing and the release process.

License

MIT — a permissive license for the client, independent of forge-dashboard's own AGPL-3.0.