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

@toolpath/app-support

v0.1.6

Published

Reusable logic for a Toolpath application: preferences, contexts and route helpers

Readme

Toolpath App Support

@toolpath/app-support is the logic a Toolpath application reuses: the preferences, contexts and route helpers every application was otherwise going to write for itself, and did.

It renders nothing. @toolpath/ui is the component kit — styling and display, the surface documented in Storybook. This package is the other half. Neither depends on the other, and that is the point: a preference read by a loader on a server has no business pulling in a Tailwind component kit, and a button has no business knowing where a preference is stored.

    @toolpath/tool-support          depends on nothing
             ↑
    @toolpath/app-support           the logic          ─┐
                                                        ├─  your application
    @toolpath/ui                    the components     ─┘

Install

npm install @toolpath/app-support react react-dom

react and react-dom are peer dependencies, needed only for the /react subpath.

Two entry points

@toolpath/app-support imports no React. A preference is read by a loader on a server as often as by a component in a browser, so the half that does not need React does not import it.

import { loadUnit, saveUnit } from '@toolpath/app-support'

const unit = loadUnit(globalThis.localStorage ?? null, 'catalog.unit')

@toolpath/app-support/react is the hooks and contexts.

import { useUnit } from '@toolpath/app-support/react'

export const UnitToggle = () => {
  const [unit, choose] = useUnit('catalog.unit')

  return (
    <button type="button" onClick={() => choose(unit === 'inches' ? 'millimeters' : 'inches')}>
      {unit}
    </button>
  )
}

The unit a person reads in

The unit belongs to the person rather than to the thing being looked at: a machinist works in one of them all day and should not set it again after opening a report or a catalog.

  • The storage and the key are the caller's. Passing the storage in is what lets this be called on a server or in a test without a window. Taking the key means two applications on one origin hold their own units instead of silently sharing one.
  • loadUnit reads the older 'in' spelling as well as 'inches'. Those values are in people's browsers now, and a reader that accepts only the current spelling moves every inch shop to metric the day it deploys.
  • useUnit opens on millimetres and reads the stored preference on the first effect, so a server render and its hydration agree instead of flashing the wrong numbers.

The vocabulary is @toolpath/tool-support's UnitSystem, which is this package's one runtime dependency.

Where this came from

loadUnit, saveUnit and useUnit shipped in @toolpath/ui 0.2.0 and 0.3.0. That was the wrong package: the component kit is styling and display, and storage policy is neither. They live here from @toolpath/ui 1.0.0 onward.

License

MIT