Npkill supports two JSON output modes that allow you to integrate it into automation scripts, monitoring systems, or other tools.
The --json option collects all results and outputs them as a single JSON object at the end of the scan. This is useful when you need all results at once for batch processing.
npkill --jsonThe --json-stream option outputs each result as a separate JSON object on its own line as soon as it's found. This is useful for real-time processing or when dealing with large scans where you want to start processing results immediately.
npkill --json-streamThe simple JSON format includes all results in a single object with metadata:
{
"version": 1,
"results": [
{
"path": "/home/user/project1/node_modules",
"size": 157286400,
"modificationTime": 1640995200000,
"riskAnalysis": {
"isSensitive": false
}
},
{
"path": "/home/user/project2/node_modules",
"size": 89478400,
"modificationTime": 1640995300000
}
],
"meta": {
"resultsCount": 2,
"runDuration": 1523
}
}Each line in streaming mode contains a single result:
{"version":1,"result":{"path":"/home/user/project1/node_modules","size":157286400,"modificationTime":1640995200000,"riskAnalysis":{"isSensitive":false}}}
{"version":1,"result":{"path":"/home/user/project2/node_modules","size":89478400,"modificationTime":1640995300000}}Errors are output to stderr in JSON format:
{
"version": 1,
"error": true,
"message": "Permission denied accessing /restricted/path",
"timestamp": "1640995300000"
}version: Schema version.path: Absolute path to the found directory.size: Directory size in bytes.modificationTime: Unix timestamp (milliseconds) of the most recently modified file.riskAnalysis: Optional risk assessment for deletionisSensitive: Whether the directory might be important for system functionality.reason: Human-readable explanation of the risk assessment.
resultsCount: Total number of results found.runDuration: Total scan time in milliseconds.
# Get all results as JSON
npkill --json > results.json
# Stream results in real-time
npkill --json-stream | while read line; do
echo "Found: $(echo $line | jq -r '.result.path')"
done# Extract only paths larger than 100MB
npkill --json | jq '.results[] | select(.size > 104857600) | .path'
# Count total size of all node_modules
npkill --json | jq '.results | map(.size) | add'
# Get the 5 largest directories
npkill --json | jq '.results | sort_by(.size) | reverse | .[0:5] | .[] | "\(.size | tostring) bytes: \(.path)"'
# Convert streaming output to a valid JSON array
npkill --json-stream | jq -s 'map(.result)'# Save results to file, ignore errors
npkill --json 2>/dev/null > results.json
# Save both results and errors to separate files
npkill --json-stream > results.jsonl 2> errors.jsonl
# Process only successful results in streaming mode
npkill --json-stream 2>/dev/null | jq -r '.result.path'# Find and delete directories older than 30 days
npkill --json | jq -r '.results[] | select(.modificationTime < (now - 2592000) * 1000) | .path' | while read dir; do
echo "Deleting old directory: $dir"
rm -rf "$dir"
done
# Generate a report of space usage
npkill --json | jq -r '.results[] | "\(.path): \(.size / 1048576 | floor)MB"' > space-report.txt
# Monitor in real-time and alert on large directories
npkill --json-stream | jq -r 'select(.result.size > 524288000) | "LARGE DIR: \(.result.path) (\(.result.size / 1048576 | floor)MB)"'# Send results to a monitoring system
npkill --json-stream | while read line; do
curl -X POST -H "Content-Type: application/json" -d "$line" http://monitoring-system/api/npkill
done
# Create a CSV report
echo "Path,Size(MB),LastModified,Status" > report.csv
npkill --json | jq -r '.results[] | "\(.path),\(.size/1048576|floor),\(.modificationTime),\(.status)"' >> report.csv
# Filter and format for human reading
npkill --json | jq -r '.results[] | select(.size > 52428800) | "📁 \(.path)\n 💾 Size: \(.size/1048576|floor)MB\n 📅 Modified: \(.modificationTime | strftime("%Y-%m-%d %H:%M:%S"))\n"'interface JsonOutputBase {
version: number;
}
interface JsonStreamOutput extends JsonOutputBase {
result: CliScanFoundFolder;
}
interface JsonSimpleOutput extends JsonOutputBase {
results: CliScanFoundFolder[];
meta: {
resultsCount: number;
runDuration: number; // milliseconds
};
}
interface JsonErrorOutput extends JsonOutputBase {
error: true;
message: string;
timestamp: string;
}
interface CliScanFoundFolder {
path: string;
size: number; // bytes
modificationTime: number; // Unix timestamp
riskAnalysis?: {
isSensitive: boolean;
reason?: string;
};
}