๐Ÿ“ธ node-screenshots

February 7, 2026 ยท View on GitHub

node-screenshots is a native node.js screenshot library based on XCap, It supports Mac, Windows, and Linux systems without any dependencies. node-screenshots supports screenshot and video recording (to be implemented).

English | ็ฎ€ไฝ“ไธญๆ–‡

Support Matrix

Operating System

Operating Systemnode16node18node20
Windows x64โœ“โœ“โœ“
Windows x32โœ“โœ“โœ“
Windows arm64โœ“โœ“โœ“
macOS x64โœ“โœ“โœ“
macOS arm64โœ“โœ“โœ“
Linux x64 gnuโœ“โœ“โœ“
Linux x64 muslโœ“โœ“โœ“
Linux arm64 gnuโœ“โœ“โœ“
Linux loongarch64โœ“โœ“โœ“

Example

Monitor

const fs = require('fs')
const { Monitor } = require('node-screenshots')

let monitor = Monitor.fromPoint(100, 100)

console.log(monitor, monitor.id())

let image = monitor.captureImageSync()
fs.writeFileSync(`${monitor.id()}-sync.png`, image.toPngSync())

monitor.captureImage().then((data) => {
  console.log(data)
  fs.writeFileSync(`${monitor.id()}.jpeg`, data.toJpegSync())
})

const monitors = Monitor.all()

monitors.forEach((item) => {
  console.log(
    'Monitor:',
    item.id(),
    item.name(),
    [item.x(), item.y(), item.width(), item.height()],
    item.rotation(),
    item.scaleFactor(),
    item.frequency(),
    item.isPrimary(),
  )
})

Window

const fs = require('fs')
const { Window } = require('node-screenshots')

let windows = Window.all()

windows.forEach((item) => {
  console.log({
    id: item.id(),
    x: item.x(),
    y: item.y(),
    y: item.z(),
    width: item.width(),
    height: item.height(),
    rotation: item.rotation(),
    scaleFactor: item.scaleFactor(),
    isPrimary: item.isPrimary(),
  })

  let image = item.captureImageSync()
  fs.writeFileSync(`${item.id()}-sync.bmp`, image.toBmpSync())

  item.captureImage().then(async (data) => {
    console.log(data)
    let newImage = await data.crop(10, 10, 10, 10)
    fs.writeFileSync(`${item.id()}.png`, await newImage.toPng())
  })
})

API

Full typeScript type definition: index.d.ts

Monitor

  • static all(): Array<Monitor>: Get all monitor
  • static fromPoint(x: number, y: number): Monitor | null: Get a monitor from the specified coordinates
  • captureImageSync(): Image: Synchronously capture image
  • captureImage(): Promise<Image>: Asynchronously capture image

Window

  • static all(): Array<Window>: Get all window
  • captureImageSync(): Image: Synchronously capture image
  • captureImage(): Promise<Image>: Asynchronously capture image

Image

  • cropSync(x: number, y: number, width: number, height: number): Image: Synchronously crop image
  • crop(x: number, y: number, width: number, height: number): Promise<Image>: Asynchronously crop image
  • toPngSync(copyOutputData?: boolean | undefined | null): Buffer:Synchronously Convert to png
  • toPng(copyOutputData?: boolean | undefined | null): Promise<Buffer>: Asynchronously Convert to png
  • toJpegSync(copyOutputData?: boolean | undefined | null): Buffer: Synchronously Convert to jpeg
  • toJpeg(copyOutputData?: boolean | undefined | null): Promise<Buffer>: Asynchronously Convert to jpeg
  • toBmpSync(copyOutputData?: boolean | undefined | null): Buffer: Synchronously Convert to bmp
  • toBmp(copyOutputData?: boolean | undefined | null): Promise<Buffer>: Asynchronously Convert to bmp
  • toRawSync(copyOutputData?: boolean | undefined | null): Buffer: Synchronously Convert to raw(RGBA data)
  • toRaw(copyOutputData?: boolean | undefined | null): Promise<Buffer>: Asynchronously Convert to raw(RGBA data)

copyOutputData: pass related parameters in electron, otherwise electron will crash, nodejs does not pass or passes false, performance will be better, for more information refer to https://github.com/napi-rs/napi-rs/issues/1346

Linux System Requirements

On Linux, you need to install libxcb, libxrandr, and dbus.

Debian / Ubuntu:

apt-get install libxcb1 libxrandr2 libdbus-1-3

Alpine:

apk add libxcb libxrandr dbus
  • xcap - XCap is a cross-platform screen capture library written in Rust