Manel is a security CLI for development environments that locally scans installed software (OS, tools, languages, databases), queries known vulnerabilities from public sources (OSV, NVD, GitHub Advisories), and generates a Security Score (0-100) with actionable recommendations.
# Global installation
npm install -g manel
# Or run directly
npx manel scan
# Quick status check
manel status- Node.js 18+ β Download from nodejs.org
- npm β Included with Node.js
- Git β For installing from source
# Check versions
node --version # Should show v18.x.x or higher
npm --version
git --versionnpm install -g manel# Clone the repository
git clone https://github.com/devcristianlopez/manel.git
cd manel
# Run installer
bash setup.sh
# Or with development mode (includes test tools)
bash setup.sh --devThe installation script:
- β Detects your operating system
- β Verifies/installs Node.js 18+
- β Installs dependencies
- β Compiles the CLI
- β
Links the
manelcommand globally - β Verifies the installation
git clone https://github.com/devcristianlopez/manel.git
cd manel
npm install
npm run build:cli
npm linknpx manel scannpm run install:global # Compile and install globally
npm run uninstall:global # Uninstall globally
npm run setup # Run bash setup.sh
npm run uninstall # Run bash uninstall.shmanel --version
manel status- β Linux (Ubuntu, Debian, Fedora, Arch)
- β macOS
β οΈ Windows (manual installation)
# If you are in the project directory
bash uninstall.sh
# Or with the path to the project
/path/to/manel/uninstall.shScript options:
bash uninstall.sh --help # Show help
bash uninstall.sh --yes # Skip confirmations
bash uninstall.sh --all # Also remove installation directorynpm uninstall -g manel# Remove global link
npm unlink -g manel
# Or remove the executable directly
rm -f $(which manel)# Refresh shell cache
hash -r| Command | Description |
|---|---|
manel status |
Quick status of installed technologies |
manel scan |
Full scan: vulnerabilities + hardening + score |
manel vulnerabilities |
Vulnerabilities only (alias: vulns) |
manel hardening |
Hardening checks only (Linux) |
manel score |
Detailed security score |
manel updates |
Check for available updates |
manel sync |
Download offline vulnerability database (OSV) |
manel history |
Show past scan results |
manel schema |
CLI introspective JSON (AI-friendly) |
# Quick status
manel status
# Full scan with JSON output
manel scan --format json
# Critical and high vulnerabilities only
manel vulnerabilities --severity CRITICAL,HIGH
# Hardening with output to file
manel hardening --output report.txt
# Detailed score without colors
manel score --no-color
# Check for available updates
manel updates --format json
# Download offline vulnerability DB, then scan without network
manel sync
manel scan --offline
# Review past scans
manel history --last 5# Install globally from npm
npm install -g manel
# Download the offline vulnerability database (one time)
# Auto-detects ecosystems from your installed software
manel syncFirst sync takes a few minutes (npm dump is ~200 MB). Re-run weekly to stay fresh β local data is trusted for 7 days.
# Quick overview of detected technologies
manel status
# Full scan: vulnerabilities + hardening + score
manel scan# Only critical and high severity findings
manel vulns --severity CRITICAL,HIGH
# Fail (exit 1) if anything critical exists β great for pre-commit hooks
manel scan --fail-on critical# SARIF report for GitHub Code Scanning
manel scan --format sarif --output scan.sarif
# JSON for scripts and dashboards
manel score --format json | jq .data.overall# Zero network requests β uses the synced local database
manel scan --offline
manel vulns --offline --severity CRITICALRequires
manel syncbeforehand. Ideal for planes, secure networks, and CI runners without internet access.
# List your last scans with scores and findings
manel history
# More entries, machine-readable
manel history --last 20 --format jsonAll commands support the following flags:
| Flag | Description |
|---|---|
-f, --format <format> |
Output format: table, json, sarif, ndjson |
-o, --output <file> |
Write output to file instead of stdout |
-s, --severity <levels> |
Filter by severity (comma-separated) |
--fail-on <severity> |
Exit with code 1 if findings >= severity |
--no-color |
Disable ANSI color output |
-q, --quiet |
Suppress non-error output |
-V, --verbose |
Enable verbose output |
--offline |
Run fully offline using local synced data (scan, vulnerabilities) |
| Format | Description | Recommended use |
|---|---|---|
table |
Formatted table with colors (default) | Interactive terminal |
json |
Pretty-printed JSON | APIs, scripts, debugging |
sarif |
Static Analysis Results Interchange Format | GitHub Code Scanning, SAST tools |
ndjson |
Newline-delimited JSON | Pipes, streaming, batch processing |
| Code | Meaning |
|---|---|
0 |
Success, no findings |
1 |
Findings detected (vulnerabilities, hardening failures) |
2 |
Internal error |
3 |
Invalid input |
name: Security Scan
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install -g manel
- name: Run security scan
run: manel scan --format sarif --output scan-results.sarif --no-interactive
- name: Upload SARIF to GitHub
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: scan-results.sarif- name: Security gate
run: manel scan --fail-on high --no-interactive --format json- name: Check vulnerabilities
run: manel vulns --severity CRITICAL,HIGH --format ndjson | jq '.severity'# Extract critical vulnerabilities
manel scan --format json | jq '.vulnerabilities[] | select(.severity == "CRITICAL")'
# Count vulnerabilities by severity
manel scan --format json | jq '[.vulnerabilities[].severity] | group_by(.) | map({(.[0]): length}) | add'
# Filter outdated technologies
manel scan --format json | jq '.technologies[] | select(.updateAvailable == true)'
# Send results to a logging service
manel scan --format ndjson | while read line; do echo "$line" | curl -X POST -d @- https://api.example.com/logs; done
# Generate SARIF report and upload to GitHub
manel scan --format sarif -o results.sarif
# Check score only
manel score --format json | jq '.overall'The score is calculated with the following weighting:
| Category | Weight |
|---|---|
| Operating System | 15% |
| Hardening | 15% |
| Tools | 10% |
| Dependencies | 30% |
| Databases | 10% |
| Critical vulnerabilities | 20% |
- Languages and runtimes: Node.js, Python, Python 3, Java
- Package managers: npm, Yarn, pnpm, pip, Maven, Gradle
- Tools: Git, Docker, Docker Compose, VS Code
- Databases: PostgreSQL, MySQL, MariaDB, MongoDB, Redis, SQLite, pgAdmin
- Operating systems: Ubuntu, Debian, Fedora, macOS, Windows
The schema command generates a JSON describing the entire CLI interface, useful for AI tools and documentation generation:
manel schema | jq '.commands[] | .name'Manel stores API responses and scan results in a local SQLite database at ~/.manel/manel.db:
- Version cache (24h TTL) β latest-version lookups skip the network on repeat runs
- Vulnerability cache (24h TTL) β OSV/NVD/GHSA results cached per
ecosystem:package:version, avoiding API rate limits - Scan history β every
scan/vulnerabilitiesrun persists detected software, findings, and score for auditing
The first run queries external APIs; subsequent runs within 24h are network-free for cached data. Override the database location with the MANEL_DB_PATH environment variable (useful for tests and CI).
For fully offline operation, download the complete OSV vulnerability database with manel sync:
manel sync # Auto-detect ecosystems from installed software
manel sync --ecosystem npm,PyPI # Specific ecosystems
manel sync --force # Re-sync even if fresh (< 24h)Where does the data come from? manel sync downloads the public OSV.dev database dumps directly from Google's servers (osv-vulnerabilities.storage.googleapis.com) and indexes them into your local SQLite at ~/.manel/manel.db. The vulnerability data is not bundled with the npm package or the repo β new CVEs are published every day, so the database is fetched on demand and stays under your control. Sizes: npm ~200MB, PyPI ~31MB, Maven ~9MB. Once synced:
manel scan --offline/manel vulns --offlinemake zero network requests- Without
--offline, fresh local data (< 7 days) is still preferred over live API calls - API failures are negative-cached for 15 minutes, so rate-limited sources are not retried on every run
Version-range matching (introduced/fixed) is evaluated locally β no semver service needed.
# Install dependencies
npm install
# Build CLI
npm run build:cli
# Run in development
node bin/manel-cli.js scan
# Run tests
npm test
# Type checking
npm run lint| Layer | Technology |
|---|---|
| CLI Framework | Commander.js 15 |
| Language | TypeScript 5 |
| Runtime | Node.js 18+ |
| Database | SQLite (better-sqlite3) |
| Tests | Vitest |
| External APIs | OSV, NVD, GitHub Security Advisories, npm registry, PyPI, endoflife.date |
manel/
βββ bin/
β βββ manel-cli.js # CLI entry point
βββ src/
β βββ cli/ # CLI framework
β β βββ commands/ # Command implementations
β β βββ output/ # Formatters (table, json, sarif, ndjson)
β β βββ flags.ts # Shared flags
β β βββ errors.ts # Error handling
β β βββ index.ts # Main entry point
β βββ core/ # Business logic
β β βββ scanner/ # Software detection
β β βββ security/ # Security engine
β β βββ update-engine/ # Version checking
β β βββ database/ # SQLite persistence
β β βββ index.ts # Barrel export
β βββ shared/ # Shared types
β βββ types.ts
βββ package.json
βββ tsconfig.cli.json # TypeScript config for CLI
βββ vitest.config.ts
See ARCHITECTURE.md for detailed technical documentation.
- OSV β Open Source Vulnerabilities database
- NVD β National Vulnerability Database (USA)
- GitHub Security Advisories β Advisory Database
- End of Life β Software support dates
- npm registry β Latest npm package versions
- PyPI β Latest Python package versions
- GitHub Releases β Latest GitHub project releases
See CONTRIBUTING.md for development and contribution guidelines.
MIT