← Back to Home

Bumblebee — Perplexity's Supply-Chain Security Scanner for Developer Machines

Bumblebee — Perplexity's Supply-Chain Security Scanner for Developer Machines

When a supply-chain attack is disclosed — a compromised npm package, a malicious PyPI release, a tampered VS Code extension — the first question security teams ask is: "Are any of our developer machines affected, right now?"

Traditional tools answer different questions. SBOMs tell you what shipped in your artifacts. EDR tells you what ran or touched the network. But nobody tells you about the messy on-disk state across lockfiles, package manager metadata, extension manifests, and developer tool configs on every engineer's laptop.

Bumblebee is a read-only inventory collector from Perplexity AI that fills exactly this gap. Released in May 2026, it scans macOS and Linux developer endpoints for package metadata, extension manifests, and MCP configs — then matches findings against exposure catalogs of known compromises. It's a single static Go binary with zero dependencies. No telemetry. No package manager execution. Just structured NDJSON output you can pipe anywhere.

What is Bumblebee?

Bumblebee turns scattered on-disk state into structured records. It answers one narrow question: when an advisory names a package, extension, or version, which developer machines show a match in their on-disk metadata?

Key capabilities:

  • Three scan profilesbaseline (global/user package roots), project (dev workspaces), deep (on-demand incident response)
  • 14+ ecosystems — npm, pnpm, Yarn, Bun, PyPI, Go modules, RubyGems, Composer, MCP configs, VS Code/Cursor/Windsurf extensions, and Chromium/Firefox browser extensions
  • Exposure catalog matching — supply a JSON catalog of known compromises, get NDJSON findings for every exact match
  • NDJSON output — structured records with stable content-addressed IDs for deduplication
  • Self-test mode — built-in end-to-end smoke test against embedded fixtures (no network calls)
  • No dependencies — Go 1.25+, stdlib only. Single static binary.
  • Read-only — scans lockfiles and metadata only. Never executes npm install, pip show, or any package manager command.

Why is it Trending?

Bumblebee hit 3,800+ GitHub stars in its first week for several reasons:

  1. The supply-chain crisis is real — XZ backdoor (CVE-2024-3094), es5-ext sabotage, Polyfill.io CDN takeover. Teams need practical response tools.
  2. A focused niche — SBOM tools miss developer machines. EDR is too heavy. Bumblebee fits between them perfectly.
  3. Perplexity's credibility — shipped by Perplexity AI, built with real incident-response experience from the team behind Xint Code
  4. Zero dependency, single binary — deploy via MDM, cron, or launchd in seconds, not hours
  5. Open-source, Apache 2.0 — inspect the code, contribute catalogs, own your data

Prerequisites

  • A Linux (x86_64, aarch64) or macOS (Intel, Apple Silicon) machine
  • Go 1.25+ if installing from source (recommended: go install)
  • Optional: cron, launchd, systemd, or an MDM solution for fleet deployment
  • Optional: a directory of threat-intel exposure catalogs (sample catalogs ship in the repo's threat_intel/)

Installation

Via Go install

go install github.com/perplexityai/bumblebee/cmd/bumblebee@latest

Pin a specific version

go install github.com/perplexityai/bumblebee/cmd/bumblebee@v0.1.1

Build from source

git clone https://github.com/perplexityai/bumblebee.git
cd bumblebee
go build -o bumblebee ./cmd/bumblebee

Stamp an explicit version at build time:

go build -ldflags "-X main.Version=v0.1.1" -o bumblebee ./cmd/bumblebee

Verify the installation

bumblebee selftest
# selftest OK (2 findings in 1ms)

A non-zero exit means your install can no longer detect what it should — a fast pre-deployment smoke test for fleet rollouts.

Quick Start

Baseline inventory scan

bumblebee scan --profile baseline > inventory.ndjson

This scans common global and user package roots (Homebrew, Python, Go, cargo, asdf, nvm), editor extensions (VS Code, Cursor, Windsurf), browser extensions, and MCP configs.

Project workspace scan

bumblebee scan --profile project \
--root "$HOME/code" \
--root "$HOME/Developer" > project-inventory.ndjson

Limit to specific ecosystems

bumblebee scan --profile baseline \
--ecosystem npm,pypi \
--ecosystem go

On-demand exposure scan

bumblebee scan --profile deep \
--root "$HOME" \
--exposure-catalog ./catalog.json \
--findings-only

This scans $HOME recursively, matches every package against your exposure catalog, and emits only finding records.

Preview scan roots

bumblebee roots --profile baseline
# prints "<root_kind>\t<path>" lines

Architecture Overview

Bumblebee follows a clean three-stage pipeline: inventory collection → optional exposure matching → structured output.

Bumblebee Architecture

The pipeline works as follows:

  1. Root Resolution — Based on the chosen profile (baseline, project, or deep), Bumblebee resolves filesystem paths to scan. Baseline discovers common global roots (Homebrew lib prefixes, /Library/Python, ~/.local, ~/.cargo, ~/go, editor config dirs, browser profile dirs). Project profiles accept explicit --root paths. Deep profiles accept any path including $HOME (with safeguards).

  2. Ecosystem Parsers — Each supported ecosystem has a dedicated parser that reads the relevant on-disk files. npm/pnpm/Yarn/Bun lockfiles produce ecosystem: npm records. PyPI reads METADATA and INSTALLER files from dist-info directories. Go modules parse go.sum and go.mod. MCP configs parse JSON host configs (mcp.json, claude_desktop_config.json, etc.). Each parser emits structured NDJSON records with confidence levels (high/medium/low) based on reliability of the source.

  3. Exposure Catalog Engine — When --exposure-catalog is provided, Bumblebee loads one or more JSON catalog files and performs exact (ecosystem, name, version) matching against every package record. Findings are emitted as separate NDJSON finding records with severity, catalog ID, and evidence details.

  4. Output Serializer — All records are written as NDJSON (newline-delimited JSON) to stdout. Diagnostics go to stderr, also as NDJSON. Each run closes with a scan_summary record that receivers use to determine whether to promote the run to current state. Optional HTTPS and file output modes are documented in the transport docs.

Output Format

Package Record

Each package found during inventory is emitted as an NDJSON record:

Field Description
record_type Always "package"
ecosystem npm, pypi, go, rubygems, packagist, mcp, editor-extension, browser-extension
package_name The package name from the source
version Installed version
confidence high (canonical metadata), medium (reliable but partial), low (config/spec only)
source_type pnpm-lockfile, yarn-lockfile, go.sum, pip-metadata, etc.
package_manager npm/pnpm/yarn/bun/pip/go/etc.
endpoint Hostname, OS, arch, username, UID, device_id
record_id Content-addressed hash, stable across runs

Finding Record

When a package matches an exposure catalog entry:

Field Description
record_type Always "finding"
finding_type "package_exposure"
severity Matches the catalog entry's severity
catalog_id Reference to the advisory
catalog_name Human-readable advisory name
evidence Description of what matched

Exposure Catalogs

Bumblebee ships with maintained exposure catalogs in the threat_intel/ directory, built from public threat-intelligence reporting on recent supply-chain campaigns. To use them:

# Download and use the bundled catalogs
git clone https://github.com/perplexityai/bumblebee.git
bumblebee scan --profile deep \
  --root "$HOME/code" \
  --exposure-catalog ./threat_intel/ \
  --findings-only

Catalog format:

{
  "schema_version": "0.1.0",
  "entries": [
    {
      "id": "advisory-2026-0042",
      "name": "example-pkg 1.2.3 (compromised release)",
      "ecosystem": "npm",
      "package": "example-pkg",
      "versions": ["1.2.3"],
      "severity": "critical"
    }
  ]
}

Fleet Deployment

Cron (Linux daily inventory)

# /etc/cron.d/bumblebee
0 6 * * * root bumblebee scan --profile baseline > /var/log/bumblebee/$(date +\%Y\%m\%d).ndjson

Launchd (macOS recurring scan)

Save as ~/Library/LaunchAgents/com.perplexity.bumblebee.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.perplexity.bumblebee</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/bumblebee</string>
        <string>scan</string>
        <string>--profile</string>
        <string>baseline</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>6</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/var/log/bumblebee/daily.ndjson</string>
    <key>StandardErrorPath</key>
    <string>/var/log/bumblebee/error.log</string>
</dict>
</plist>

Systemd timer (Linux)

# /etc/systemd/system/bumblebee.service
[Unit]
Description=Bumblebee supply-chain inventory scan

[Service]
Type=oneshot
ExecStart=/usr/local/bin/bumblebee scan --profile baseline
StandardOutput=append:/var/log/bumblebee/daily.ndjson
StandardError=append:/var/log/bumblebee/error.log
# /etc/systemd/system/bumblebee.timer
[Unit]
Description=Daily Bumblebee scan

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Comparison with Alternatives

  • SBOM generators (Syft, Trivy) — focus on container and build artifacts, not developer machines. Don't scan MCP configs, editor extensions, or browser addons.
  • EDR agents (CrowdStrike, SentinelOne) — heavy, expensive, network-telemetry focused. Bumblebee is read-only, free, and developer-machine-specific.
  • npm audit / pip-audit — package-registry-specific, require the toolchain to be installed, execute package manager commands. Bumblebee never executes package managers.
  • Manual inventory — grepping node_modules across hundreds of machines isn't scalable. Bumblebee produces structured, stable-id records.

Resources

  • GitHub: github.com/perplexityai/bumblebee
  • Documentation: built-in via bumblebee --help, plus docs/ in the repo (inventory-sources.md, state-model.md, transport.md)
  • Threat Intel Catalogs: threat_intel/ directory in the repo — maintained exposure catalogs from public reporting
  • License: Apache 2.0
← Retour à l'Accueil

Bumblebee — Le Scanner de Sécurité Supply-Chain de Perplexity pour Machines Développeur

Bumblebee — Le Scanner de Sécurité Supply-Chain de Perplexity pour Machines Développeur

Lorsqu'une attaque sur la supply-chain est divulguée — un paquet npm compromis, une version malveillante sur PyPI, une extension VS Code trafiquée — la première question des équipes de sécurité est : "Est-ce que nos machines développeur sont affectées, maintenant ?"

Les outils traditionnels répondent à d'autres questions. Les SBOM indiquent ce qui a été livré dans vos artefacts. Les EDR indiquent ce qui a été exécuté ou a touché le réseau. Mais personne ne vous renseigne sur l'état fragmenté des fichiers sur disque — lockfiles, métadonnées des gestionnaires de paquets, manifests d'extensions et configurations d'outils — sur chaque poste d'ingénieur.

Bumblebee est un collecteur d'inventaire read-only de Perplexity AI qui comble exactement cette lacune. Lancé en mai 2026, il scanne les postes macOS et Linux pour trouver des métadonnées de paquets, des manifests d'extensions et des configurations MCP — puis croise les résultats avec des catalogues d'exposition de compromissions connues. C'est un binaire Go statique unique, zéro dépendance. Pas de télémétrie. Pas d'exécution de commandes. Juste du NDJSON structuré que vous pouvez rediriger n'importe où.

Qu'est-ce que Bumblebee ?

Bumblebee transforme l'état fragmenté du disque en enregistrements structurés. Il répond à une question précise : lorsqu'un avis de sécurité nomme un paquet, une extension ou une version, quelles machines développeur présentent une correspondance dans leurs métadonnées locales ?

Fonctionnalités clés :

  • Trois profils de scanbaseline (racines globales/utilisateur), project (espaces de travail dev), deep (réponse incident à la demande)
  • 14+ écosystèmes — npm, pnpm, Yarn, Bun, PyPI, modules Go, RubyGems, Composer, configurations MCP, extensions VS Code/Cursor/Windsurf et extensions navigateur Chromium/Firefox
  • Correspondance avec catalogue d'exposition — fournissez un catalogue JSON de compromissions connues, obtenez des résultats NDJSON pour chaque correspondance exacte
  • Sortie NDJSON — enregistrements structurés avec identifiants stables basés sur le contenu pour la déduplication
  • Mode auto-test — test de fumée intégré contre des fixtures embarquées (sans appel réseau)
  • Zéro dépendance — Go 1.25+, uniquement la stdlib. Binaire statique unique.
  • Read-only — analyse uniquement les lockfiles et métadonnées. N'exécute jamais npm install, pip show ou toute commande de gestionnaire de paquets.

Pourquoi ça Cartonne ?

Bumblebee a atteint 3 800+ étoiles GitHub en une semaine pour plusieurs raisons :

  1. La crise de la supply-chain est réelle — backdoor XZ (CVE-2024-3094), sabotage es5-ext, reprise du CDN Polyfill.io. Les équipes ont besoin d'outils pratiques.
  2. Un créneau bien ciblé — les outils SBOM ignorent les machines développeur. L'EDR est trop lourd. Bumblebee se place parfaitement entre les deux.
  3. La crédibilité de Perplexity — livré par Perplexity AI, construit avec l'expérience réelle de réponse aux incidents de l'équipe derrière Xint Code
  4. Binaire unique, zéro dépendance — déploiement via MDM, cron ou launchd en secondes
  5. Open-source, Apache 2.0 — inspectez le code, contribuez aux catalogues, possédez vos données

Prérequis

  • Une machine Linux (x86_64, aarch64) ou macOS (Intel, Apple Silicon)
  • Go 1.25+ si installation depuis les sources (recommandé : go install)
  • Optionnel : cron, launchd, systemd ou une solution MDM pour le déploiement en flotte
  • Optionnel : un répertoire de catalogues d'exposition threat-intel (des catalogues d'exemple sont fournis dans le dossier threat_intel/ du dépôt)

Installation

Via Go install

go install github.com/perplexityai/bumblebee/cmd/bumblebee@latest

Version spécifique

go install github.com/perplexityai/bumblebee/cmd/bumblebee@v0.1.1

Compilation depuis les sources

git clone https://github.com/perplexityai/bumblebee.git
cd bumblebee
go build -o bumblebee ./cmd/bumblebee

Avec une version explicite :

go build -ldflags "-X main.Version=v0.1.1" -o bumblebee ./cmd/bumblebee

Vérifier l'installation

bumblebee selftest
# selftest OK (2 findings in 1ms)

Un code de retour non-nul signifie que votre installation ne peut plus détecter ce qu'elle devrait — un test de fumée rapide avant déploiement en flotte.

Démarrage Rapide

Scan d'inventaire de base

bumblebee scan --profile baseline > inventory.ndjson

Ceci scanne les racines globales et utilisateur courantes (Homebrew, Python, Go, cargo, asdf, nvm), les extensions d'éditeur (VS Code, Cursor, Windsurf), les extensions navigateur et les configurations MCP.

Scan d'espace de travail

bumblebee scan --profile project \
--root "$HOME/code" \
--root "$HOME/Developer" > project-inventory.ndjson

Limiter à certains écosystèmes

bumblebee scan --profile baseline \
--ecosystem npm,pypi \
--ecosystem go

Scan d'exposition à la demande

bumblebee scan --profile deep \
--root "$HOME" \
--exposure-catalog ./catalog.json \
--findings-only

Ceci scanne $HOME récursivement, compare chaque paquet à votre catalogue d'exposition, et émet uniquement les résultats de type finding.

Aperçu des racines de scan

bumblebee roots --profile baseline
# affiche les lignes "<root_kind>\t<path>"

Architecture

Bumblebee suit un pipeline en trois étapes : collecte d'inventaire → correspondance d'exposition optionnelle → sortie structurée.

Architecture Bumblebee

Le pipeline fonctionne comme suit :

  1. Résolution des Racines — Selon le profil choisi (baseline, project, ou deep), Bumblebee résout les chemins à scanner. Le profil baseline découvre les racines globales courantes (préfixes Homebrew, /Library/Python, ~/.local, ~/.cargo, ~/go, dossiers de configuration des éditeurs, profils navigateur). Le profil project accepte des chemins --root explicites. Le profil deep accepte tout chemin y compris $HOME (avec des garde-fous).

  2. Analyseurs d'Écosystème — Chaque écosystème dispose d'un analyseur dédié qui lit les fichiers pertinents. Les lockfiles npm/pnpm/Yarn/Bun produisent des enregistrements ecosystem: npm. PyPI lit les fichiers METADATA et INSTALLER des dossiers dist-info. Les modules Go analysent go.sum et go.mod. Les configurations MCP analysent les fichiers JSON hôtes (mcp.json, claude_desktop_config.json, etc.). Chaque analyseur émet des enregistrements NDJSON structurés avec des niveaux de confidence (élevé/moyen/faible).

  3. Moteur de Catalogue d'Exposition — Lorsque --exposure-catalog est fourni, Bumblebee charge un ou plusieurs fichiers JSON de catalogue et effectue une correspondance exacte (ecosystem, name, version) contre chaque enregistrement de paquet. Les résultats sont émis sous forme d'enregistrements finding NDJSON séparés avec sévérité, ID de catalogue et détails de preuve.

  4. Sérialiseur de Sortie — Tous les enregistrements sont écrits en NDJSON (JSON délimité par saut de ligne) sur stdout. Les diagnostics vont sur stderr, également en NDJSON. Chaque exécution se termine par un enregistrement scan_summary que les récepteurs utilisent pour déterminer s'il faut promouvoir l'exécution comme état courant.

Format de Sortie

Enregistrement de Paquet

Champ Description
record_type Toujours "package"
ecosystem npm, pypi, go, rubygems, packagist, mcp, editor-extension, browser-extension
package_name Nom du paquet depuis la source
version Version installée
confidence high (métadonnées canoniques), medium (fiable mais partiel), low (config/spécification uniquement)
source_type pnpm-lockfile, yarn-lockfile, go.sum, pip-metadata, etc.
package_manager npm/pnpm/yarn/bun/pip/go/etc.
endpoint Hostname, OS, arch, nom d'utilisateur, UID, device_id
record_id Hachage du contenu, stable entre exécutions

Enregistrement de Résultat (Finding)

Champ Description
record_type Toujours "finding"
finding_type "package_exposure"
severity Correspond à la sévérité de l'entrée du catalogue
catalog_id Référence à l'avis de sécurité
catalog_name Nom lisible de l'avis
evidence Description de ce qui a correspondu

Catalogues d'Exposition

Bumblebee est livré avec des catalogues d'exposition maintenus dans le répertoire threat_intel/, construits à partir de rapports publics de threat intelligence sur les campagnes récentes de supply-chain.

# Télécharger et utiliser les catalogues fournis
git clone https://github.com/perplexityai/bumblebee.git
bumblebee scan --profile deep \
  --root "$HOME/code" \
  --exposure-catalog ./threat_intel/ \
  --findings-only

Format du catalogue :

{
  "schema_version": "0.1.0",
  "entries": [
    {
      "id": "advisory-2026-0042",
      "name": "example-pkg 1.2.3 (version compromise)",
      "ecosystem": "npm",
      "package": "example-pkg",
      "versions": ["1.2.3"],
      "severity": "critical"
    }
  ]
}

Déploiement en Flotte

Cron (Linux, inventaire quotidien)

# /etc/cron.d/bumblebee
0 6 * * * root bumblebee scan --profile baseline > /var/log/bumblebee/$(date +\%Y\%m\%d).ndjson

Launchd (macOS, scan récurrent)

Enregistrer comme ~/Library/LaunchAgents/com.perplexity.bumblebee.plist :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.perplexity.bumblebee</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/bumblebee</string>
        <string>scan</string>
        <string>--profile</string>
        <string>baseline</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>6</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/var/log/bumblebee/daily.ndjson</string>
    <key>StandardErrorPath</key>
    <string>/var/log/bumblebee/error.log</string>
</dict>
</plist>

Systemd timer (Linux)

# /etc/systemd/system/bumblebee.service
[Unit]
Description=Scan d'inventaire Bumblebee

[Service]
Type=oneshot
ExecStart=/usr/local/bin/bumblebee scan --profile baseline
StandardOutput=append:/var/log/bumblebee/daily.ndjson
StandardError=append:/var/log/bumblebee/error.log
# /etc/systemd/system/bumblebee.timer
[Unit]
Description=Scan Bumblebee quotidien

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Comparaison avec les Alternatives

  • Générateurs SBOM (Syft, Trivy) — ciblent les conteneurs et artefacts de build, pas les machines développeur. Ne scannent pas les configurations MCP, extensions d'éditeur ou modules navigateur.
  • Agents EDR (CrowdStrike, SentinelOne) — lourds, coûteux, orientés télémétrie réseau. Bumblebee est read-only, gratuit, et spécifique aux postes développeur.
  • npm audit / pip-audit — spécifiques à un registre, nécessitent la chaîne d'outils installée, exécutent des commandes. Bumblebee n'exécute jamais de gestionnaires de paquets.
  • Inventaire manuel — grepper node_modules sur des centaines de machines n'est pas scalable. Bumblebee produit des enregistrements structurés avec des identifiants stables.

Ressources

  • GitHub : github.com/perplexityai/bumblebee
  • Documentation : via bumblebee --help et le dossier docs/ du dépôt (inventory-sources.md, state-model.md, transport.md)
  • Catalogues Threat Intel : dossier threat_intel/ dans le dépôt — catalogues d'exposition maintenus à partir de rapports publics
  • Licence : Apache 2.0