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

@nutrikit/sdk

v0.2.1

Published

JavaScript SDK for the Nutrikit API: food search, nutrient breakdowns, text/voice/photo meal logging, barcode and label scanning, meal plans.

Readme

@nutrikit/sdk

npm

JavaScript client for the Nutrikit nutrition API: food search, nutrient breakdowns, meal logging from text, voice and photos, barcode and nutrition-label scanning, meal plans and a nutrition advisor.

Get a free API key · Docs · API reference · Source

  • No dependencies. Works in browsers and Node 18+ (anything with fetch).
  • TypeScript types included.
  • Retries 429, 502 and 503 responses, honouring Retry-After.

Install

npm install @nutrikit/sdk

Usage

import { Nutrikit } from '@nutrikit/sdk';

const nk = new Nutrikit({
  apiKey: process.env.NUTRIKIT_KEY,          // nk_… secret key (server-side only)
  baseUrl: 'https://nutrikit.onrender.com',  // the hosted API, or your own Nutrikit server
});

const meal = await nk.logText('2 eggs, a slice of toast and coffee with milk');
meal.totals.calories;   // { amount: 234, unit: 'kcal', dailyValuePercent: 12 }

baseUrl defaults to the page's own origin in a browser and to http://localhost:8787 elsewhere, so set it whenever your API lives on another host. Nutrikit is self-hostable: point baseUrl at your own server instead.

In browsers and mobile apps

Never ship the secret key to a client. Have your server exchange it for a 1-hour access token and hand that over:

// server
const { access_token } = await nk.createAccessToken();

// browser
const client = new Nutrikit({ apiKey: access_token, baseUrl: 'https://nutrikit.onrender.com' });

Methods

| Method | What it does | |---|---| | searchFoods(q, { limit, offset, source }) | Search the food database | | getFood(id) | Nutrients per 100 g and household portions | | getNutrients(id, { quantity, unit, grams }) | Nutrients for a portion, with % daily value | | listNutrients() | Every nutrient key, unit and daily value | | logText(text, { ai }) | Log a meal from a description | | logVoice(transcript, { ai }) | Log a meal from a spoken transcript | | logPhoto(image, { mediaType, hint }) | Log a meal from a photo (File, Blob, ArrayBuffer, Uint8Array, data URL or base64) | | lookupBarcode(code) | Packaged product by EAN/UPC | | parseLabel({ text }) / parseLabel({ image }) | Read a nutrition label from text or a photo | | createMealPlan({ calories, proteinGrams, diet, meals, days, exclude, seed }) | 1–7 day meal plan | | askAdvisor(question, { context }) | Nutrition question answered by the server's AI provider (declines medical questions) | | getUsage() | Tokens used this month, by endpoint | | createAccessToken() | Short-lived token for client apps |

Browser-only helpers:

await nk.voiceLog();                                    // speech recognition on the device, then logVoice()
const code = await Nutrikit.scanBarcode(videoElement);  // BarcodeDetector API

After each call, nk.lastUsage holds { charged, remaining } from the response's token headers.

Errors

Failed calls throw a NutrikitError with status, code and retryAfter:

import { NutrikitError } from '@nutrikit/sdk';

try {
  await nk.searchFoods('banana');
} catch (e) {
  if (e instanceof NutrikitError && e.code === 'quota_exceeded') { /* out of tokens this month */ }
}

Quota exhaustion (quota_exceeded) is not retried.

Options

| Option | Default | | |---|---|---| | apiKey | – | Secret key (nk_…) or access token (nkat_…). Required | | baseUrl | page origin / http://localhost:8787 | Your Nutrikit server | | fetch | globalThis.fetch | Custom fetch implementation | | maxRetries | 2 | Retries for 429, 502, 503 | | timeoutMs | 60000 | Per-request timeout |

License

MIT