Skip to content

Repository files navigation

macstats

Node module for macOS system statistics. Get real-time CPU, GPU, battery, memory, disk, and sensor data from your Mac.

Table of Contents

Example output

Screenshot 2025-11-09 at 09 56 11

Installation

npm i macstats -g

CLI Usage

# Show system stats (single snapshot)
macstats
# Show all disks including system volumes
macstats --detailed
macstats -d
# Launch real-time dashboard with live updates
macstats --watch
macstats -w
# Launch real-time dashboard with all disks
macstats -w -d
# Show help
macstats --help

Controls (in watch mode)

  • q or Ctrl+C - Exit
  • r - Force refresh

API Reference

Importing

import{getCpuData,getGpuData,getBatteryData,getRAMUsage,getDiskInfo,getFanData,getPowerData,getSensorData,getSystemData}from'macstats';// Or use synchronous versionsimport{getCpuDataSync,getGpuDataSync,getBatteryDataSync,getRAMUsageSync,getDiskInfoSync,getFanDataSync,getPowerDataSync,getSensorDataSync,getSystemDataSync}from'macstats';

CPU

getCpuData() / getCpuDataSync()

Get CPU temperature, die temperature, and voltage.

Returns:Promise<CPU> / CPU

PropertyTypeDescription
temperaturenumberCPU temperature in °C
temperatureDienumberCPU die temperature in °C
voltagenumberCPU voltage in Volts

Example:

constcpu=awaitgetCpuData();console.log(`CPU Temp: ${cpu.temperature}°C`);console.log(`CPU Die Temp: ${cpu.temperatureDie}°C`);

getCPUUsage() / getCPUUsageSync()

Get CPU usage statistics including load averages.

Returns:Promise<CPUUsage> / CPUUsage

PropertyTypeDescription
userLoadnumberUser CPU load (0.0 - 1.0)
systemLoadnumberSystem CPU load (0.0 - 1.0)
idleLoadnumberIdle CPU load (0.0 - 1.0)
totalUsagenumberTotal CPU usage (0.0 - 1.0)
totalUsagePercentnumberTotal CPU usage as percentage (0 - 100)
loadAvg1number1 minute load average
loadAvg5number5 minute load average
loadAvg15number15 minute load average

Example:

constusage=awaitgetCPUUsage();console.log(`CPU Usage: ${usage.totalUsagePercent}%`);console.log(`Load Average (1m): ${usage.loadAvg1}`);

GPU

getGpuData() / getGpuDataSync()

Get GPU temperature, voltage, and usage.

Returns:Promise<GPU> / GPU

PropertyTypeDescription
temperaturenumberGPU temperature in °C
voltagenumberGPU voltage in Volts
usagenumberGPU usage percentage (0-100)

Example:

constgpu=awaitgetGpuData();console.log(`GPU Temp: ${gpu.temperature}°C`);console.log(`GPU Usage: ${gpu.usage}%`);

Battery

getBatteryData() / getBatteryDataSync()

Get comprehensive battery information including charge, health, and time remaining.

Returns:Promise<Battery> / Battery

PropertyTypeDescription
external_connectedbooleanIs external power connected
battery_installedbooleanIs battery installed
is_chargingbooleanIs battery currently charging
fully_chargedbooleanIs battery fully charged
voltagenumberBattery voltage in mV
cycle_countnumberNumber of charge cycles
design_capacitynumberDesign capacity in mAh
max_capacitynumberMaximum capacity in mAh
current_capacitynumberCurrent capacity in mAh
design_cycle_countnumberDesign cycle count
time_remainingnumberTime remaining in seconds
time_remaining_formattedstringFormatted time remaining (e.g., "6:30:45")
temperaturenumberBattery temperature in °C
percentagenumberBattery health percentage (0-100)
cycle_percentagenumberCycle count percentage (0-100)
amperagenumberCurrent amperage in mA
powernumberPower in Watts
charge_percentnumberCurrent charge percentage (0-100)
health_percentnumberBattery health percentage (0-100)

Example:

constbattery=awaitgetBatteryData();console.log(`Charge: ${battery.charge_percent}%`);console.log(`Health: ${battery.health_percent}%`);console.log(`Time Remaining: ${battery.time_remaining_formatted}`);console.log(`Cycles: ${battery.cycle_count}/${battery.design_cycle_count}`);

Memory & RAM

getMemoryData() / getMemoryDataSync()

Get memory voltage information.

Returns:Promise<Memory> / Memory

PropertyTypeDescription
voltagenumberMemory voltage in Volts

getRAMUsage() / getRAMUsageSync()

Get detailed RAM usage statistics.

Returns:Promise<RAMUsage> / RAMUsage

PropertyTypeDescription
totalnumberTotal RAM in bytes
totalGBnumberTotal RAM in GB
usednumberUsed RAM in bytes
usedGBnumberUsed RAM in GB
freenumberFree RAM in bytes
freeGBnumberFree RAM in GB
usagePercentnumberUsage percentage (0-100)
activenumberActive RAM in bytes
activeGBnumberActive RAM in GB
inactivenumberInactive RAM in bytes
inactiveGBnumberInactive RAM in GB
wirednumberWired RAM in bytes
wiredGBnumberWired RAM in GB
compressednumberCompressed RAM in bytes
compressedGBnumberCompressed RAM in GB
appnumberApp memory in bytes
appGBnumberApp memory in GB
cachenumberCache memory in bytes
cacheGBnumberCache memory in GB
swapTotalnumberTotal swap in bytes
swapTotalGBnumberTotal swap in GB
swapUsednumberUsed swap in bytes
swapUsedGBnumberUsed swap in GB
swapFreenumberFree swap in bytes
swapFreeGBnumberFree swap in GB
pressureLevelnumberMemory pressure level (1=normal, 2=warning, 4=critical)
pressureStatusstringMemory pressure status ("Normal", "Warning", or "Critical")

Example:

constram=awaitgetRAMUsage();console.log(`RAM Usage: ${ram.usedGB}GB / ${ram.totalGB}GB (${ram.usagePercent}%)`);console.log(`Memory Pressure: ${ram.pressureStatus}`);console.log(`Swap: ${ram.swapUsedGB}GB / ${ram.swapTotalGB}GB`);

Disk

getDiskInfo() / getDiskInfoSync()

Get information about all mounted disks.

Returns:Promise<DiskInfo[]> / DiskInfo[]

PropertyTypeDescription
namestringDisk name
mountPointstringMount point path
fileSystemstringFile system type
totalSizenumberTotal size in bytes
totalSizeGBnumberTotal size in GB
freeSizenumberFree size in bytes
freeSizeGBnumberFree size in GB
usedSizenumberUsed size in bytes
usedSizeGBnumberUsed size in GB
usagePercentnumberUsage percentage (0-100)
bsdNamestringBSD name (e.g., "disk0s1")
isRemovablebooleanIs removable media

Example:

constdisks=awaitgetDiskInfo();disks.forEach(disk=>{console.log(`${disk.name}: ${disk.usedSizeGB}GB / ${disk.totalSizeGB}GB (${disk.usagePercent}%)`);});

Fans

getFanData() / getFanDataSync()

Get fan speed information for all fans.

Returns:Promise<Fan> / Fan

The Fan object is a dictionary where keys are fan indices and values are FanInfo objects:

PropertyTypeDescription
rpmnumberCurrent fan speed in RPM
minnumberMinimum fan speed in RPM
maxnumberMaximum fan speed in RPM

Example:

constfans=awaitgetFanData();Object.entries(fans).forEach(([index,fan])=>{console.log(`Fan ${index}: ${fan.rpm} RPM (${fan.min}-${fan.max})`);});

Power

getPowerData() / getPowerDataSync()

Get comprehensive power consumption metrics for all system components.

Returns:Promise<Power> / Power

PropertyTypeDescription
cpunumberCPU power consumption in Watts
gpunumberGPU power consumption in Watts
anenumberANE (Apple Neural Engine) power in Watts
allnumberCombined power (cpu + gpu + ane) in Watts
systemnumberTotal system power consumption in Watts
ramnumberRAM power consumption in Watts
gpu_ramnumberGPU RAM (SRAM) power consumption in Watts

Example:

constpower=awaitgetPowerData();console.log(`CPU Power: ${power.cpu}W`);console.log(`GPU Power: ${power.gpu}W`);console.log(`ANE Power: ${power.ane}W`);console.log(`RAM Power: ${power.ram}W`);console.log(`Combined (CPU+GPU+ANE): ${power.all}W`);console.log(`Total System Power: ${power.system}W`);

Sensors

getSensorData() / getSensorDataSync()

Get all available sensor readings including temperatures, voltages, and currents.

Returns:Promise<SensorData> / SensorData

PropertyTypeDescription
temperaturesSensor[]Array of temperature sensors
voltagesSensor[]Array of voltage sensors
currentsSensor[]Array of current sensors

Sensor Object:

PropertyTypeDescription
namestringSensor name/identifier
valuenumberSensor reading value

Example:

constsensors=awaitgetSensorData();sensors.temperatures.forEach(sensor=>{console.log(`${sensor.name}: ${sensor.value}°C`);});

System

getSystemData() / getSystemDataSync()

Get system information including OS version, model, and hardware details.

Returns:Promise<SystemInfo> / SystemInfo

PropertyTypeDescription
totalMemorynumberTotal RAM in bytes
totalMemoryGBnumberTotal RAM in GB
uptimenumberSystem uptime in seconds
uptimeFormattedstringFormatted uptime (e.g., "5d 3h 42m")
osVersionstringmacOS version (e.g., "14.1")
osCodenamestringmacOS codename (e.g., "Sonoma")
modelNamestringModel name (e.g., "Apple M3 Pro")
hardwareModelstringHardware model (e.g., "Mac14,6")
serialNumberstringSerial number
screenSizestringScreen size (e.g., "14-inch")
releaseYearstringRelease year and month (e.g., "Nov 2023")

Example:

constsystem=awaitgetSystemData();console.log(`Model: ${system.modelName}`);console.log(`OS: macOS ${system.osVersion} (${system.osCodename})`);console.log(`Uptime: ${system.uptimeFormatted}`);console.log(`RAM: ${system.totalMemoryGB}GB`);

Complete Example

import{getCpuData,getGpuData,getBatteryData,getRAMUsage,getDiskInfo,getFanData,getPowerData,getSensorData,getSystemData}from'macstats';asyncfunctionmain(){try{const[system,cpu,gpu,battery,ram,disks,fans,power,sensors]=awaitPromise.all([getSystemData(),getCpuData(),getGpuData(),getBatteryData(),getRAMUsage(),getDiskInfo(),getFanData(),getPowerData(),getSensorData()]);console.log('=== System ===');console.log(`Model: ${system.modelName}`);console.log(`OS: macOS ${system.osVersion}`);console.log(`Uptime: ${system.uptimeFormatted}`);console.log('\n=== CPU ===');console.log(`Temperature: ${cpu.temperature}°C`);console.log(`Die Temperature: ${cpu.temperatureDie}°C`);console.log('\n=== GPU ===');console.log(`Temperature: ${gpu.temperature}°C`);console.log(`Usage: ${gpu.usage}%`);console.log('\n=== Power ===');console.log(`CPU: ${power.cpu}W`);console.log(`GPU: ${power.gpu}W`);console.log(`ANE: ${power.ane}W`);console.log(`RAM: ${power.ram}W`);console.log(`Combined: ${power.all}W`);console.log(`System Total: ${power.system}W`);console.log('\n=== Memory ===');console.log(`Usage: ${ram.usedGB}GB / ${ram.totalGB}GB (${ram.usagePercent}%)`);console.log('\n=== Battery ===');console.log(`Charge: ${battery.charge_percent}%`);console.log(`Health: ${battery.health_percent}%`);console.log('\n=== Disks ===');disks.forEach(disk=>{console.log(`${disk.name}: ${disk.usedSizeGB}GB / ${disk.totalSizeGB}GB`);});console.log('\n=== Fans ===');Object.entries(fans).forEach(([index,fan])=>{console.log(`Fan ${index}: ${fan.rpm} RPM`);});}catch(error){console.error('Error:',error);}}main();

Synchronous vs Asynchronous

All functions have both async and sync versions:

  • Async:getCpuData(), getGpuData(), etc. - Returns Promise
  • Sync:getCpuDataSync(), getGpuDataSync(), etc. - Returns value directly

Use synchronous versions for simple scripts, async versions for better performance in applications.

Requirements

  • macOS 10.12 or later
  • Node.js 18.0 or later

License

MIT

About

MacOS X Statistics - Battery, Fans, CPU, System Info, Storage, Memory

Topics

Resources

Stars

71 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages