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

@hubbleai/hubble-sdk

v0.1.0

Published

TypeScript client for the Hubble Patient Access API.

Readme

@hubbleai/hubble-sdk

TypeScript client for the Hubble Patient Access API: create patient authorization links, exchange them for consent-scoped access tokens, and read FHIR R4 data.

import { Hubble } from "@hubbleai/hubble-sdk";

const hub = new Hubble({ clientId: "hbl_client_prod_...", clientSecret: "hbl_prod_..." });

// 1. Create a patient link and send the patient to it. Optionally prefill with
//    patient: { firstName, ... } demographics, providers: [{ name }], and the
//    optional organization your verified Hubble organization represents.
const link = await hub.createLink({ patientRef: "abc123", onBehalfOfOrganizationName: "Acme Health" });
console.log(link.verification_uri_complete);

// 2. Wait for the patient to authorize (polls the token endpoint for you).
const session = await hub.waitForAuthorization(link);

// 3. Read the patient's FHIR data (Bearer token + auto-refresh handled for you).
const bundle = await session.everything();
const observations = await session.fhir("Observation", { query: { category: "vital-signs" } });
const pdf = await session.exportPdf(); // pdf.data bytes; pdf.sourcesFailed counts failed sources

// Consent management
for (const consent of await hub.listConsents({ status: "active" })) {
  console.log(consent.id, consent.patient_ref);
}
await hub.revokeConsent(session.consentId!);

What the client handles for you

  • Auth per plane — HTTP Basic (your app credentials) for consent management and the token endpoint; Bearer (the consent token) for FHIR reads.
  • Default base URLhttps://portal.hubble.ai. Override only with a trusted value; your access token is sent to it.
  • Device-flow pollingwaitForAuthorization honors the server's interval and slow_down.
  • Correct FHIR paths — paths like Patient/$everything are sent unencoded.
  • Transparent refresh — FHIR reads refresh and retry once on a 401.
  • Typed FHIR responses — reads are typed against @types/fhir (R4): everything()/summary() return a Bundle, and fhir() returns the FhirResource union. Narrow with a type argument, e.g. session.fhir<Patient>("Patient/123").

Ships as ESM and CommonJS with type declarations.

Layout

Hubble / PatientSession are hand-written (src/hubble.ts). The low-level client generated from the OpenAPI contract with @hey-api/openapi-ts lives in src/client (regenerated on every spec change; never edited by hand) and is also re-exported for direct access. See the repo root README for how to regenerate.