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

@nitishbhosale7/psd

v1.0.1

Published

A friendly fork of @webtoon/psd: a zero-dependency Adobe Photoshop .psd/.psb parser with a normalized, well-named API for blend modes, layer effects, text styling, visibility, and group bounds.

Readme

@nitishbhosale7/psd

A friendly fork of @webtoon/psd — a fast, zero-dependency Adobe Photoshop .psd/.psb parser for browsers and Node.js — with a normalized, well-named API layered on top.

@webtoon/psd parses PSDs correctly and completely, but a lot of the useful data comes out in Adobe's raw form: blend modes as 4-char codes ("norm", "mul "), layer effects and fills as nested descriptor Maps keyed by codes like "SoFi" / "Md " / "Clr ", text styling buried in EngineData, and layer groups that expose no bounds. This fork keeps the original parser intact and adds clean getters so you don't have to decode any of that yourself.

Install

npm install @nitishbhosale7/psd

What this fork adds

All additions are plain getters on the existing Layer and Group nodes — the rest of the @webtoon/psd API is unchanged.

| Member | On | Description | | ----------------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | blendModeName | Layer, Group | Friendly blend-mode name, e.g. "normal", "multiply" (vs. the raw blendMode code). | | visible | Layer, Group | Convenience inverse of isHidden (works for groups too). | | isClipped | Layer, Group | true when clipped to the layer below. | | effects | Layer, Group | Normalized { colorOverlay?, dropShadow?, stroke? } with named fields (color {r,g,b} 0–1, opacity, angle, distance, blur, spread, blend mode, stroke position) — parsed from the lfx2 effects descriptor. | | textStyle | Layer | Normalized text styling: { fontName, fontStyle, fontSize, color {r,g,b,a}, tracking, leading, autoLeading, alignment, isParagraph } — parsed from EngineData. | | left / top / width / height | Group | Bounding box computed from a group's descendants (upstream groups expose none). |

Example

import Psd from "@nitishbhosale7/psd";

const psd = Psd.parse(arrayBuffer);

function walk(node) {
  if (node.type === "Layer") {
    console.log(node.name, {
      visible: node.visible,
      blend: node.blendModeName,
      effects: node.effects, // e.g. { colorOverlay: { color: {r:1,g:1,b:1}, opacity: 100, blendMode: "normal" } }
      text: node.textStyle, // e.g. { fontName: "SamsungSSHead-Bold", fontSize: 75, alignment: "center", ... }
    });
  }
  if (node.type === "Group") {
    console.log(
      node.name,
      "bounds:",
      node.left,
      node.top,
      node.width,
      node.height,
      "visible:",
      node.visible
    );
  }
  for (const child of node.children ?? []) walk(child);
}
walk(psd);

Everything else (parsing, composite(), masks, image resources, EngineData, raw descriptors) behaves exactly like @webtoon/psd. See the upstream docs for the base API.

Credits

This is a fork of @webtoon/psd by NAVER WEBTOON. All of the heavy lifting — the binary parser and the Rust/WASM decoder — is their work. This fork only adds a convenience layer and keeps the original tests passing.

License

Released under the MIT License.

Copyright 2021-present NAVER WEBTOON
Copyright 2026-present Nitish Bhosale (modifications)