Signal Engine
Signal Engine is a modular tool for aggregating, normalizing, and analyzing the
output of static code analysis tools.
It is designed to provide insight into top rules, top files, and clusters of
findings across multiple scans.
Signal Engine takes scan outputs, in JSON format, and transforms them into actionable insights:
- Top Rules – see which rules are triggered most frequently
- Top Files – identify the files with the highest number of findings
- Clusters – group related findings to reveal patterns and correlations
Currently supported tools
- semgrep
Features
- Ingest and parse JSON outputs from supported tools
- Normalize findings into a consistent structure
- Compute top rules and top files
- Group findings into basic clusters
- Export results in CSV format
Installation
pip install signal-engine
Usage
Ingesting results
Ingest findings from static analysis JSON files into the repository database.
Ingest multiple JSON files from a directory
signal-cli ingest --repo-name myrepo --tool semgrep /path/to/json_reports/
- --repo-name → name of the repository
- --tool → the tool that generated the findings (semgrep, bandit, etc.)
- positional argument → path to JSON file or directory containing multiple JSON files
Ingest a single JSON file
signal-cli ingest --repo-name myrepo --tool semgrep /path/to/json_reports/report.json
After ingest, all findings are stored in a SQLite database located in the standard user data directory, and can be queried with analyze or info.
Analyzing ingested results
By default, analyze prints results to standard output:
signal-cli analyze --repo-name myrepo
Optional CSV export with -o / --output:
signal-cli analyze --repo-name myrepo -o analysis.csv
Show Repository Info
Basic info about a repository’s ingestion:
signal-cli info --repo-name myrepo
A possible output can be something like:
Repository: myrepo
DB path: /home/user/.local/share/signal-engine/<hash>.db
Ingest time: 2026-02-03T14:25:01+00:00
Number of findings: 153
Verbose mode with top rules and tools:
signal-cli info --repo-name myrepo --verbose
Repository: myrepo
DB path: /home/user/.local/share/signal-engine/<hash>.db
Ingest time: 2026-02-03T14:25:01+00:00
Number of findings: 153
Tool version used for ingest: 0.1.2
Tools in DB: semgrep, bandit
Top 5 rules:
javascript.browser.security.eval-detected.eval-detected: 12
python.security.audit.use-of-exec: 8
...
Database migrations
Signal Engine uses a lightweight migration system to manage database schema
changes over time. Each repository database keeps track of applied migrations
via the schema_migrations table.
Migrations are distributed with the package and applied explicitly via the CLI.
This allows existing databases to be upgraded safely when new features introduce
schema changes (e.g. new tables such as metrics).
When running migrations, Signal Engine will:
- Detect which migrations are missing for a given repository database
- Apply them in order
- Record their application to avoid reapplying them in the future
This approach ensures backward compatibility with existing databases while allowing the schema to evolve as new analysis features are introduced.
Applying database migrations
Signal Engine ships with database migrations to evolve the schema of repository
databases over time (for example, when introducing new tables such as
metrics).
To apply migrations to a specific repository database, use the migrate command
and pass the repository name:
signal-cli migrate --repo-name myrepo
To check if a migration is needed, you can use the --check flag. Please note that this don't apply pending migrations.
signal-cli migrate --repo-name myrepo
LICENSE
License: AGPL v3 This project is licensed under the AGPLv3 license.
Metadata
Release files for signal-engine 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| signal_engine-0.3.0.tar.gz | 25.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| signal_engine-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 50.5 kB
Release files / signal_engine-0.3.0.tar.gz
| Download URL | signal_engine-0.3.0.tar.gz |
|---|---|
| Size | 25.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d414cc38bde3fb3f56226e1dea0ae847f73acd49a08337f69522e684890ff083
|
|
BLAKE2b-256 checksum How to use checksums |
48a08f4482a724f785279aa8c02e3d55c56b0ac3b078dd57d03123203ac9f629
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.11
|
Release files / signal_engine-0.3.0-py3-none-any.whl
| Download URL | signal_engine-0.3.0-py3-none-any.whl |
|---|---|
| Size | 25.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6141075f52f70cb4f898bafe9ca25c990ab0baa1f3855466f7b1ff28f896df59
|
|
BLAKE2b-256 checksum How to use checksums |
72f61a651c2cf84287cf9c1bdeaeffecb00b1474f3350bb90f9bbb006e4b2c9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.11
|
Security for signal-engine 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.