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

@untheme/terrazzo

v0.2.1

Published

Codegen from DTCG (2025.10) design token JSON to an `untheme.config.ts`. A [terrazzo](https://terrazzo.app) plugin and a programmatic `generate()` share one pipeline: the resolver document's modifiers become untheme's axes, aliases survive as live referen

Readme

@untheme/terrazzo

Codegen from DTCG (2025.10) design token JSON to an untheme.config.ts. A terrazzo plugin and a programmatic generate() share one pipeline: the resolver document's modifiers become untheme's axes, aliases survive as live references, and the output is validated against untheme's own schema — including a round-trip proof that Terrazzo's resolution and untheme's composition agree on every token at every selection.

Token names keep their DTCG dotted paths (color.primary.600); the CSS renderer dashes them into custom properties. Theme documents are plain DTCG token files that rebind a subset of the base contract — each becomes a layer in the generated catalog. The default export is the configuration (theme and input); the catalog is a named themes export, proven against the config's contract, for whatever serves it — the Nuxt module's themes option, a catalog provider, or a hand-rolled switcher.

Plugin

// terrazzo.config.js
import { defineConfig } from "@terrazzo/cli";
import untheme from "@untheme/terrazzo";

export default defineConfig({
  tokens: "./tokens.resolver.json",
  plugins: [
    untheme({
      themes: [{ source: "./themes/dark-ocean.json", name: "Dark Ocean" }],
    }),
  ],
});

tz build writes untheme.config.ts into the output directory. Theme documents resolve against the first token source and load without credentials.

Programmatic

generate() owns parsing, so a caller-supplied req can authenticate every document the parse touches — remote resolver, referenced sets, and theme documents alike. It returns the file contents; the caller owns I/O.

import { generate } from "@untheme/terrazzo";

const { filename, contents } = await generate({
  source: "https://api.example.com/v1/orgs/acme/resolver.json",
  req: async (src) => {
    const response = await fetch(src, {
      headers: { authorization: `Bearer ${key}` },
    });
    return response.text();
  },
});

Boundaries

  • Terrazzo's beta token types (boolean, string, link) are off-spec and fail codegen by name; $extends is ignored.
  • A theme or context may only rebind base tokens, never add them.
  • Every modifier needs a default context — untheme boots one context per axis.
  • Token names that would collide as CSS custom properties (a.b vs a-b) fail codegen.