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

@comamoca/komeiji

v0.1.1

Published

Generate a satori-friendly VDOM from a string of HTML. Modern, Bun-ready successor of satori-html.

Downloads

153

Readme

komeiji

Generate a satori-friendly VDOM from a string of HTML.

Modern, Bun-ready successor of satori-html — drop-in API compatible, with the known upstream bugs fixed.

Why a rewrite

satori-html has not published a release since 2022-12 and crashes on every input under Bun 1.x (the bundled parsel selector engine cannot handle the :where([style]) rule the CSS inliner always injects). This library keeps the same API and output contract while:

| | satori-html | komeiji | |---|---|---| | Bun / Node / Edge | crashes under Bun | works everywhere (tested on Bun 1.3 + Node 24) | | HTML entities | & renders literally | decoded (HTML spec) | | CSS custom props | --x corrupted to -X | preserved | | Uppercase tags | DIV misses satori preset styles | lowercased (HTML spec) | | Malformed style="" | tolerant | tolerant ({}), never throws | | url(a;b.png) in styles | works | works | | Types | any-heavy | strict, no any |

Install

bun add komeiji        # or npm/pnpm

Usage

import satori from "satori";
import { html } from "komeiji";

const markup = html`<div style="color: black;">hello, world</div>`;
const svg = await satori(markup, {
  width: 600,
  height: 400,
  fonts: [],
});

The html utility can be used as a tagged template literal or as a plain function.

html`<div style="color: ${color};">hello</div>`;
html('<div style="color: black;">hello</div>');

<style> elements are parsed and inlined onto matching elements (class, id, tag and attribute selectors, comma lists, combinators; cascade ordered by specificity then source order; the inline style attribute always wins). At-rules such as @media are ignored, matching upstream behavior.

Elements whose class looks like Tailwind utilities get the class copied into the special tw prop, which satori consumes natively.

Example

A runnable OG-image example lives in examples/og-image.ts. It renders an 800x400 card from HTML (inline styles + a <style> block + Tailwind classes + interpolations) and writes examples/output.svg:

bun run example
<div style="display: flex; padding: 48px">
  <style>.brand { color: #6366f1; }</style>
  <h2 style="font-size: 40px">${title}</h2>
  <span class="brand">Start your free trial today.</span>
</div>

Deviations from satori-html

All render-equivalent through satori or strict improvements, and each is locked by a test:

  • HTML entities are decoded in text and attribute values.
  • children arrays never contain holes (comments and whitespace-only text are simply skipped; satori drops them anyway).
  • Tag and attribute names are lowercased.
  • CSS custom properties are preserved; vendor prefixes follow the React convention (-webkit-transformWebkitTransform, -ms-flexmsFlex).
  • Property names are case-insensitive (COLOR: works).
  • Interpolations use the cooked template strings (Bun 1.3 mis-escapes astral characters in strings.raw).

Development

bun install
bun test        # unit + golden-render tests
bun run build   # tsc -> dist

The golden SVG snapshots in test/snapshots/ were captured once from [email protected] (via Node, where that package works) and are committed, so render parity with the reference is checked byte-for-byte on every test run without depending on it.

License

MIT