Explore, compare, and track open-source detection rules across multiple security vendors β in one place.
π Live Site: detectionexplorer.io
Detection Explorer ingests and normalizes detection rules from 11 major open-source security content repositories into a unified schema, enabling cross-vendor comparison, MITRE ATT&CK coverage analysis, and coverage gap identification.
Detection engineers work across multiple rule formats daily β Sigma YAML, Elastic TOML, Splunk YAML β each with different schemas, severity levels, and metadata structures. Detection Explorer normalizes all of them into a single searchable interface so you can:
- Search & filter across 11 vendors with full-text search, severity, status, and MITRE tactic/technique filters
- Compare coverage across vendors for any MITRE technique or keyword
- Identify gaps β find techniques covered by one vendor but missing from another
- Stay current β sync and re-ingest to pull the latest rules from each repo
- Export filtered results as JSON or CSV for downstream use
| Repository | Format |
|---|---|
| SigmaHQ | YAML |
| Elastic Detection Rules | TOML |
| Elastic Hunting Queries | TOML |
| Elastic Protections | TOML |
| Splunk Security Content | YAML |
| Sublime Rules | YAML |
| LOLRMM | YAML |
| Microsoft Sentinel | YAML |
| Google SecOps | YARA-L |
| Okta customer-detections | YAML (OIE / SPL) |
| Auth0 customer-detections | YAML (Sigma + SPL) |
Everything below is for running Detection Explorer locally.
# Clone the repository
git clone git@github.com:InfoSecJay/threat-detection-explorer.git
cd threat-detection-explorer
# Backend setup
cd backend
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # macOS/Linux
pip install -r requirements.txt
# Frontend setup (in a new terminal)
cd frontend
npm install
# Run (in separate terminals)
# Terminal 1 - Backend:
cd backend && python run.py
# Terminal 2 - Frontend:
cd frontend && npm run devThe frontend will be available at http://localhost:5173 and the API at http://localhost:8000.
- Python 3.11+
- Node.js 18+
- Git
threat_detection_explorer/
βββ backend/ # FastAPI Python backend
β βββ app/
β β βββ api/ # REST API routes
β β βββ models/ # SQLAlchemy database models
β β βββ parsers/ # Vendor-specific rule parsers
β β βββ normalizers/ # Rule normalization logic
β β βββ services/ # Business logic services
β βββ tests/ # Pytest test suite
βββ frontend/ # React TypeScript frontend
β βββ src/
β βββ components/
β βββ pages/
β βββ hooks/
β βββ services/
βββ data/ # Runtime data (git-ignored)
βββ repos/ # Cloned repositories
βββ threat_detection.db # SQLite database
On first use, sync the detection rule repositories:
- Go to the Dashboard
- Click "Sync" for each repository (SigmaHQ, Elastic, Splunk, etc.)
- Wait for the clone/pull to complete
After syncing, ingest the rules into the database:
- Click "Ingest" for each synced repository
- Wait for parsing and normalization to complete
- Browse: Go to Detections page to search and filter rules
- Compare: Use the Compare page to see coverage across vendors
- Export: Download filtered results as JSON or CSV
GET /api/health- Health check
GET /api/repositories- List all repositoriesPOST /api/repositories/{name}/sync- Sync a repositoryPOST /api/repositories/{name}/ingest- Ingest rules from repository
GET /api/detections- List detections with filtersGET /api/detections/{id}- Get detection detailsGET /api/detections/statistics- Get statistics
GET /api/compare?technique=T1059- Compare by MITRE techniqueGET /api/compare?keyword=powershell- Compare by keywordGET /api/compare/coverage-gap?base_source=sigma&compare_source=elastic- Find coverage gaps
POST /api/export- Export detections as JSON or CSV
Every rule from every source ends up looking the same β ~40 canonical fields covering identity, status/severity, the canonical platform/data-source/event-type taxonomy, MITRE mapping, and observables extracted from the detection logic itself.
Full reference: docs/schema.md β field-by-field
table, per-source vendor β canonical mapping, and a worked round-trip
example.
For depth on how the canonical taxonomy resolver works per vendor, see
docs/taxonomy.md.
cd backend
pytest tests/ -vEnvironment variables (can be set in .env):
DEBUG- Enable debug mode (default: false)DATABASE_URL- SQLite database URL (default: sqlite+aiosqlite:///./data/threat_detection.db)CORS_ORIGINS- Allowed CORS origins (default: http://localhost:5173,http://localhost:3000)
MIT