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

@anarkisti/dab

v0.2.5

Published

dab on a folder of character-grid sprites: a Vite plugin serving the pixel editor and the folder to it, an MCP server for drawing with a model, and the format itself for a game to read sprites with.

Readme

@anarkisti/dab

dab on a folder of character-grid sprites — rows of characters plus the palette they mean (the format). Three ways in:

  • A Vite plugin: the pixel editor in your project's dev server, editing your sprite folder in place — any browser, no folder picker. A sprite written by anything else shows up in the open editor.
  • An MCP server: a model reads frames as ruled rows, looks at renders, and draws through the same operations the editor uses. Every read returns a version and every write must quote it, so a save in the editor is never overwritten.
  • @anarkisti/dab/core: the format itself, for a game to draw its sprites with — the walk the editor draws an assembly in (layers), a grid's frame as packed pixels (pixels), a whole subject in one (assembly), animations (frameAt), the validator. Pure, no DOM; a bundler takes only what is used.

The package installs no dependencies of its own: what the MCP server and the plugin run is bundled in (licences in dist/THIRD-PARTY-LICENSES.txt).

0.x: the interface may change between minor versions.

In a Vite project

npm install -D @anarkisti/dab
// vite.config.ts
import dab from "@anarkisti/dab/vite";

export default defineConfig({
  plugins: [dab({ sprites: "src/lib/sprites" })],
});

vite dev then serves the editor at /__dab/, and MCP on port 3061. That port is the same in every project, so the MCP server is registered once:

claude mcp add --transport http dab http://localhost:3061/mcp

It serves whichever project's dev server is running, one at a time. Pass mcp: <port> for another port, or mcp: false for none.

Without a dev server

claude mcp add dab -- npx @anarkisti/dab mcp --root src/lib/sprites

dab mcp serves one folder over stdio.

In a game

import { assembly, frameAt } from "@anarkisti/dab/core";
import deer from "./sprites/deer.json";

// The deer at its walk's step, parts and all, facing left, as an ImageData.
const { w, h, x, y, px } = assembly(deer, frameAt(deer, "walk", step), { flip: "h" });
ctx.putImageData(new ImageData(new Uint8ClampedArray(px.buffer), w, h), left - x, top - y);

layers gives the same subject grid by grid, for a game that holds a part's own frame or caches each grid; pixels draws one. Cache what you draw: these compute a fresh grid every call.

License

MIT