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

inkpot

v0.4.0

Published

CLI for Paper design tools — pdf, form, save/load .inkpot bundles via MCP.

Readme

inkpot

CLI for Paper design tools. Four stateless commands that move designs between Paper (via its MCP server) and files.

npx inkpot pdf vp                # build vp.pdf from Paper frames vp/1, vp/2, ...
npx inkpot form contract         # fillable PDF with AcroForm text fields
npx inkpot save vp               # pack vp/* → vp.inkpot (portable bundle)
npx inkpot load vp.inkpot        # unpack a bundle back into Paper

Commands

| Command | Description | |---|---| | inkpot list | Print all artboards on the canvas | | inkpot pdf <prefix> | Compact PDF from artboards <prefix>/1..Ndocs | | inkpot form <arg> | Fillable PDF; {field:<key>} layer names → AcroForm fields — docs | | inkpot save <prefix> | Pack <prefix>/1..N into a .inkpot bundle — docs | | inkpot load <path> | Unpack a .inkpot bundle into Paper — docs |

Global flags: -o <path> / -n <name> (output/name), --mcp-url <url>, -h, -v. Run inkpot <command> --help for per-command options. Full contract in SPEC.md.

Install

npm install -g inkpot
# or run without installing
npx inkpot pdf vp

Requires Node.js ≥ 20, Google Chrome (or Chromium), and Paper running with its MCP server enabled (defaults to http://127.0.0.1:29979/mcp).

Why

We're at an odd point in the evolution: AI agents are capable enough to do real design work, but the canvases themselves are monolithic SaaS. Figma owns the collaboration story, but its MCP isn't good enough for AI to be a real peer on the canvas, and everything else about it — format, API, team state — is locked to a single vendor's cloud.

Paper is proprietary too, but its MCP and UI are actually good. That's the lever. inkpot uses Paper's seams to produce outputs that aren't locked to Paper:

  • pdf / form — compact PDFs for print, and signable AcroForm contracts straight from a designed layout (a 17-page bloom-heavy deck drops from ~21 MB to ~3 MB).
  • save / load — a transparent, inspectable .inkpot bundle: plain JSX + assets in a zip. Travels anywhere. Opens next year.

Four small commands — enough to get your designs out of a proprietary canvas and into a form you actually own.

Design invariants

  • Stateless. No config, cache, or state beyond CLI args and explicitly named files.
  • Naming is the manifest. <prefix>/<n> (integer, contiguous from 1) groups artboards.
  • Filename is the prefix. A .inkpot file's basename IS the prefix its artboards load under.
  • Deterministic. Same inputs → byte-identical outputs.
  • Pure core, impure edges. src/core/* never touches IO; src/io/* is the only place that talks to Paper, Chrome, the network, or the filesystem.

Code layout

bin/inkpot.js              entry
src/
  cli.js                   dispatch + root help
  commands/{list,pdf,form,save,load}.js   thin orchestrators
  core/                    pure — transformations, no IO
    format.js              .inkpot header, hash, mime, URL patterns
    resolve.js             artboard list → frames
    jsx.js                 URL rewrite ↔ data-URI inline
    bundle.js              buffer ↔ .inkpot contents (fflate)
    layout.js              page geometry (pdf) + placement (load)
    render.js              JSX → HTML (esbuild + React SSR)
    optimize.js            HTML → HTML (blooms, photos)
    fields.js              field marker injection + PDF overlay
  io/                      impure — Paper MCP, Chrome, fetch, fs
test/                      node:test unit tests for core/

License

MIT — see LICENSE.