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

@acdvorak/edid-parser-ts

v1.1.1

Published

Pure TypeScript EDID parser with zero dependencies. Exports ESM and CJS and supports all JS runtimes (Node, browser, Deno, Bun, etc.).

Readme

@acdvorak/edid-parser-ts

Pure TypeScript EDID parser with zero dependencies.

Exports ESM and CJS bundles.

Supports all JS runtimes (Node, browser, Deno, Bun, etc.).

Contributing

This library is a passion project I wrote in my spare time. It's a hobby, not a job.

Issues and pull requests are welcome, but don't be offended if you don't receive a timely response. It probably just means I'm busy with family, work, and life.

Usage

This library exports two API functions:

  • parseEdid(bytes) - Fully decodes EDID blocks, including CTA-861 extensions, colorimetry, and HDR static/dynamic metadata.
  • getVendorInfo(vid) - Returns the name of the display manufacturer.
    • Well-known or notable display vendors have short, UI-friendly brand names (e.g., "Samsung" instead of "Samsung Electronics Co., Ltd."), sourced from several manually-curated lists.
    • Less-common display vendors return whatever's in the official UEFI registry.

Example:

import { getVendorInfo, parseEdid } from '@acdvorak/edid-parser-ts';

/** Samsung S95C, model QN65S95CAF, ca. 2023. HDR10+, VRR, 144 Hz. */
const SAMSUNG_S95C_EDID_BYTES = new Uint8Array([
  0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4c, 0x2d, 0xa5, 0x73, 0x00,
  // ...
]);

const parsedEdid = parseEdid(SAMSUNG_S95C_EDID_BYTES);

console.log(getVendorInfo('SAM'));
console.log(parsedEdid);

will output:

{ vid: 'SAM', goodName: 'Samsung' }
{
  "featureSupport": {
    "hdmiVersion": 2.1,
    "edidVersion": 1.3,

    // DisplayID is the modern successor to EDID.
    // When present, it is stored as an extension block inside an EDID.
    "displayIdVersion": 1.2,

    // Range of the color palette — i.e., the outer limits of which colors the
    // display can hit (gamut/primaries), not the HDR tone curve.
    "colorGamuts": ["srgb", "display_p3", "rec_2020"],

    // Bit depth = how finely the display can shade within the active gamut.
    "maxInputSignalBitDepth": 12,

    // HDR support
    "supportsHDR10": true,
    "supportsHDR10Plus": true,
    "supportsDolbyVision": false,

    // Manual Low-Latency Mode
    "supportsGameMode": true,

    // Auto Low-Latency Mode (auto-detect video game consoles)
    "supportsALLM": true,

    // Standard/Static Refresh Rate
    "minSrrHz": 48,
    "maxSrrHz": 144,

    // Variable Refresh Rate
    "supportsVRR": true,
    "minVrrHz": 48,
    "maxVrrHz": 144,
  },

  "vendorInfo": {
    "vid": "SAM",
    "goodName": "Samsung",
  },

  "productInfo": {
    "productCode": 29605,
    "serialNumberInt": 16780800,
    "serialNumberStr": "...",
    "modelName": "QCQ95S",
    "manufactureWeek": 1,
    "manufactureYear": 2023,
  },

  "basicDisplayParams": {
    "physicalWidthInMm": 1420,
    "physicalHeightInMm": 800,
    "diagonalInches": 64.2,
  },

  "nativeResolution": {
    "activeHorizontalPixels": 3840,
    "activeVerticalLines": 2160,
    "physicalWidthInMm": 1872,
    "physicalHeightInMm": 1053,
    "diagonalInches": 84.6,
    "isInterlaced": false,
    "refreshRateHz": 60,
  },

  "baseBlock": {
    "vendorId": "SAM",

    "standardDisplayModes": [
      {
        "xResolution": 1280,
        "xyPixelRatio": 3,
        "vertFreqHz": 60,
      },
      // ...
      {
        "xResolution": 1920,
        "xyPixelRatio": 3,
        "vertFreqHz": 60,
      },
    ],

    "dtds": [
      {
        "horizontalActivePixels": 3840,
        "verticalActivePixels": 2160,
        "horizontalDisplaySizeInMm": 1872,
        "verticalDisplaySizeInMm": 1053,
        "isInterlaced": false,
        "stereoModeCode": 0,
        "syncTypeCode": 3,
      },
      {
        "horizontalActivePixels": 2560,
        "verticalActivePixels": 1440,
        "horizontalDisplaySizeInMm": 1872,
        "verticalDisplaySizeInMm": 1053,
        "isInterlaced": false,
        "stereoModeCode": 0,
        "syncTypeCode": 3,
      },
    ],
  },

  "extensions": [
    {
      "extTagByte": 2,
      "revisionNumber": 3,
      "supportsUnderscan": true,
      "supportsBasicAudio": true,
      "supportsYCbCr444": true,
      "supportsYCbCr422": true,
      "extensionType": "cta-861",
      "dataBlockCollection": [
        {
          "tag": {
            "string": "EXTENDED TAG",
            "value": 7,
          },
          "extendedTag": {
            "string": "VIDEO CAPABILITY",
            "value": 0,
          },
          "quantizationRangeYCC": false,
          "quantizationRangeRGB": true,
          "overscanPT": "No data",
          "overscanIT": "Supports both overscan and underscan",
          "overscanCE": "Supports both overscan and underscan",
        },
        {
          "tag": {
            "string": "EXTENDED TAG",
            "value": 7,
          },
          "extendedTag": {
            "string": "COLORIMETRY",
            "value": 5,
          },
          "supportsBT2020RGB": true,
          "supportsBT2020YCC": true,
          "supportsBT2020cYCC": false,
          "supportsAdobeRGB": false,
          "supportsAdobeYCC601": false,
          "supportssYCC601": false,
          "supportsxvYCC709": true,
          "supportsxvYCC601": true,
          "gamutMD3": 0,
          "gamutMD2": 0,
          "gamutMD1": 0,
          "gamutMD0": 1,
        },
        {
          "tag": {
            "string": "VENDOR SPECIFIC",
            "value": 3,
          },
          "ieeeOui": 3075,
          "physicalAddress": 8192,
          "supportsAI": true,
          "supportsDeepColor48": false,
          "supportsDeepColor36": true,
          "supportsDeepColor30": true,
          "supportsDeepColorY444": true,
          "supportsDualDvi": false,
        },
        {
          "tag": {
            "string": "VENDOR SPECIFIC",
            "value": 3,
          },
          "ieeeOui": 12869080,
          "hdmiForumFeatures": {
            "isScdcPresent": true,
            "supportsQMS": true,
            "supportsALLM": true,
            "supportsVESADSC12a": true,
            "supportsCompressedVideo420": true,
            "supportsQMSTFRmin": true,
            "supports10bpcCompressedVideo": true,
          },
          "version": 1,
          "maxTMDSCharacterRateMhz": 600,
          "supportsSCDC": true,
          "supportsSCDCRR": false,
          "maxFixedRateLink": "4 lanes @ 10 Gbps",
          "vrrMinHz": 48,
          "vrrMaxHz": 144,
        },
        {
          "tag": {
            "string": "EXTENDED TAG",
            "value": 7,
          },
          "extendedTag": {
            "string": "HDR STATIC METADATA",
            "value": 6,
          },
          "supportedEOTFs": [
            "Traditional gamma - SDR luminance range",
            "SMPTE ST2084 (PQ)",
            "Hybrid Log-Gamma (HLG)",
          ],
          "supportedStaticMetadataDescriptors": ["Static Metadata Type 1"],
        },
        {
          "tag": {
            "string": "EXTENDED TAG",
            "value": 7,
          },
          "extendedTag": {
            "string": "YCBCR420_CAPABILITY_MAP",
            "value": 15,
          },
          "YCbCr420CapableShortVideoDescriptors": [
            {
              "vic": 97,
              "isNativeResolution": false,
            },
            // ...
          ],
        },
      ],
    },
  ],
}

What is EDID?

EDID is a small array of bytes, hard-coded into a monitor or TV's firmware at manufacture time, that advertises which features a physical display claims to support.

Important: EDID cannot tell us anything about the current, active display mode, and it cannot tell us whether a given display mode is actually usable with the current setup. It can only tell us which display modes the monitor/TV is probably capable of displaying IFF the GPU and cable can also deliver them.

Metadata

From EDID you can usually derive:

  • Manufacturer ID (Apple, Samsung, LG, etc.)
  • Product ID
  • Serial number
  • Physical dimensions (width and height in centimeters)
  • List of supported resolutions, refresh rates, pixel formats, and colorimetry

With extension blocks, you may also see things like:

  • Audio support (codecs, channel counts, sample rates)
  • Color spaces (RGB / Y'CbCr variants)
  • Deep color and bits-per-channel claims
  • HDR support (HDR10, HDR10+, Dolby Vision, HLG)
  • VRR support (often via HDMI Forum VRR / Adaptive-Sync indicators rather than a single universal flag)

Gotchas

  1. Static metadata: EDID bytes are effectively baked into the display's firmware at manufacturing/assembly time: they do not change when the user switches the current resolution/refresh/HDR mode, and they do not tell you the active mode (only OS/GPU APIs can do that).
  2. Unreliable values: EDID data quality varies wildly. Blocks can be incomplete, wrong, copy-pasted across models, updated in later revisions, or even spoofed/overridden by docks, KVMs, adapters, and drivers. Do not assume that EDID data is 100% accurate or trustworthy.
  3. Non-unique: EDIDs are not guaranteed to be globally unique. In particular, serial numbers are often missing or duplicated.

If you need robust display identification and "what's active right now?" answers, treat EDID as an identity hint + capability claims, and combine it with other signals (OS display IDs, connector/path info, sink OUI/vendor blocks, and runtime mode queries).

Vendor IDs

Plug-n-Play Vendor IDs (aka PNP IDs or VIDs) are 3-letter codes that uniquely identify the company that manufactured the display.

Vendor IDs consist of 3 uppercase Latin letters (A-Z). Manufacturers can and often do have multiple VIDs.

For example, the most common VIDs in consumer monitors/TVs are:

| VID | Manufacturer | Models | | :---- | :----------------------- | ------: | | ACI | Asus | 5546 | | ACR | Acer | 9266 | | AOC | AOC International | 7081 | | APP | Apple | 1245 | | AUO | AU Optronics | 2103 | | AUS | Asus | 4093 | | BNQ | BenQ | 6499 | | BBY | Best Buy | 283 | | DEL | Dell | 18260 | | GBT | Gigabyte | 1052 | | GSM | LG | 14288 | | HEC | Hisense | 437 | | HPN | Hewlett Packard | 3901 | | HWP | Hewlett Packard | 4938 | | LCD | Toshiba | 165 | | LEN | Lenovo | 3755 | | LGD | LG | 1294 | | LPL | LG Philips | 190 | | MEI | Panasonic | 408 | | MSI | Micro-Star International | 1963 | | NEC | NEC Corporation | 877 | | PHL | Philips | 5920 | | SAM | Samsung | 18273 | | SDC | Samsung | 331 | | SHP | Sharp | 1260 | | SNY | Sony | 1011 | | TCL | TCL Corporation | 585 | | TOL | TCL Corporation | 3 | | TSB | Toshiba | 332 | | VIZ | Vizio | 634 | | VSC | ViewSonic | 2733 | | WOR | Dell | 132 |

VID database

There is no single canonical, correct, complete list of all known VIDs, so I merged the following sources together and cleaned them up as best I could:

  1. My own custom list of manually-curated VIDs and short brand names for major and notable manufacturers.
  2. @linuxhw/EDID - Repository of decoded EDIDs from real-world digital and analog monitors, collected by Linux users at linux-hardware.org.
  3. Lansweeper Knowledge Base article
  4. pnp.ids from @vcrhonek/hwdata - Derived from the "official" UEFI registry, with custom patches for correctness/completeness.
  5. "Official" UEFI registry (incomplete and low quality):

The getVendorInfo(vid) function searches each dataset for the corresponding ID and returns the "highest-quality" name it can find.

VID deprecation

According to the Unified Extensible Firmware Interface Forum:

Sunset of Vendor IDs in PnP Form

Starting at the end of 2024, the UEFI Forum no longer issues new 3-letter Plug and Play (PnP) Vendor Identifiers (a "VID"). For ACPI implementation purposes, a 4-letter ACPI ID can be used for all situations where the ID is needed, for example in creating device identifiers.

As of early 2026, no manufacturers are using ACPI IDs yet; VIDs are still the standard identifier used in all displays.

Development

Install dependencies:

npm install

Run the unit tests:

npm run test

Build the library:

npm run build

Update EDID vendor ID databases:

npm run update

Credit

This package is a TypeScript fork of https://github.com/dgallegos/edidreader. They did all the hard work of figuring out how to actually parse the giant ball of crazy that is EDID; all I did was slap some typedefs on top of it.