diff --git a/CHANGELOG.md b/CHANGELOG.md
index e9537da..49dfe11 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@
All notable changes to this project will be documented in this file.
## [v1.85.0]
-- Added `--fast` mode: sets `--commit-metadata=false` and `--no-base64` for maximum scan speed. Findings will omit Git commit context (author, date, commit hash) and will not include Base64-decoded secrets.
+- Added `--turbo` mode: sets `--commit-metadata=false`, `--no-base64`, disables language detection, and disables tree-sitter parsing...for maximum scan speed. Findings will omit Git commit context (author, date, commit hash) and will not include Base64-decoded secrets.
- SQLite database scanning: kingfisher now detects and extracts SQLite files (`.db`, `.sqlite`, `.sqlite3`, etc.), dumping each table as SQL text with named columns so secrets stored in database rows are scannable. Controlled by the existing `--extract-archives` flag.
- Python bytecode (.pyc) scanning: extracts string constants from compiled Python (`.pyc`, `.pyo`) files via marshal parsing so secrets embedded in bytecode are scannable. Controlled by `--extract-archives`.
- Performance: pipelined ODB enumeration — scanning now begins while blob OIDs are still being discovered, overlapping I/O with pattern matching.
diff --git a/README.md b/README.md
index c53a717..4f29db2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Kingfisher
+# Kingfisher: Open Source Secret Scanner with Live Validation
@@ -7,16 +7,25 @@
[](https://github.com/mongodb/kingfisher/pkgs/container/kingfisher)
-Kingfisher is a blazingly fast secret-scanning and **live validation** tool built in Rust.
+Kingfisher is an open source secret scanner and **live secret validation** tool built in Rust.
-It combines Intel's SIMD-accelerated regex engine (Hyperscan) with language-aware parsing to achieve high accuracy at massive scale, and **ships with hundreds of built-in rules** to detect, **validate**, and triage secrets before they ever reach production.
+It combines Intel's SIMD-accelerated regex engine (Hyperscan) with language-aware parsing to achieve high accuracy at massive scale, and **ships with hundreds of built-in rules** to detect, **validate**, and triage leaked API keys, tokens, and credentials before they ever reach production.
-Designed for offensive security engineers and blue-teamers alike, Kingfisher helps you pivot across repo ecosystems, validate exposure paths, and hunt for developer-owned leaks that spill beyond the primary codebase.
+Designed for offensive security engineers and blue-team defenders alike, Kingfisher helps you scan repositories, cloud storage, chat, docs, and CI pipelines to find and verify exposed secrets quickly.
**Learn more:** [Introducing Kingfisher: Real‑Time Secret Detection and Validation](https://www.mongodb.com/blog/post/product-release-announcements/introducing-kingfisher-real-time-secret-detection-validation)
+## What Is Kingfisher?
+
+Kingfisher is a high-performance, open source secret detection tool for source code and developer platforms. If you are searching for a "GitHub secret scanner," "API key scanner," "token leak detection," or "Git secrets scanner," this project is built for that workflow.
+
+- Scan code, Git history, and integrated platforms (GitHub, GitLab, Azure Repos, Bitbucket, Gitea, Hugging Face, Jira, Confluence, Slack, Docker, AWS S3, and Google Cloud Storage)
+- Validate discovered credentials against provider APIs to reduce false positives
+- Revoke supported secrets directly from the CLI
+- Generate JSON, SARIF, and HTML outputs for security teams, compliance, and CI
+
## Key Features
### Multiple Scan Targets
@@ -60,7 +69,7 @@ See ([docs/COMPARISON.md](docs/COMPARISON.md))
kingfisher scan /path/to/scan --view-report
```
NOTE: Replay has been slowed down for demo
-
+
## Report Viewer Demo
Explore Kingfisher's built-in report viewer and its `--access-map`, which can show what the token (AWS, GCP, Azure, GitHub, GitLab, and Slack...more coming) can actually access.
@@ -77,13 +86,14 @@ Serving access-map viewer at http://127.0.0.1:7890 (Ctrl+C to stop)
kingfisher scan /path/to/scan --access-map --view-report
```
-
+
**Click to view video**
[](https://github.com/user-attachments/assets/d33ee7a6-c60a-4e42-88e0-ac03cb429a46)
# Table of Contents
+- [What Is Kingfisher?](#what-is-kingfisher)
- [Key Features](#key-features)
- [Compliance and Audit-Ready Scans](#compliance-and-audit-ready-scans)
- [Benchmark Results](#benchmark-results)
@@ -312,9 +322,10 @@ kingfisher scan /path/to/code
# Scan without validation
kingfisher scan ~/src/myrepo --no-validate
-# Fast mode: run as fast as possible by disabling Git commit metadata and Base64 decoding
-# (findings omit commit context and Base64-encoded secrets)
-kingfisher scan ~/src/myrepo --fast
+# Turbo mode: run as fast as possible by disabling Git commit metadata, Base64 decoding,
+# MIME sniffing, language detection, and tree-sitter parsing
+# (findings omit commit context, Base64-only matches, MIME type, and language metadata)
+kingfisher scan ~/src/myrepo --turbo
# Display only secrets confirmed active by third‑party APIs
kingfisher scan /path/to/repo --only-valid
@@ -398,9 +409,10 @@ cat /path/to/file.py | kingfisher scan -
# Limit maximum file size scanned (default: 256 MB)
kingfisher scan /some/file --max-file-size 500
-# Fast mode: equivalent to --commit-metadata=false --no-base64 for maximum speed
-# No Git commit metadata (author, date, hash) or Base64 decoding in findings
-kingfisher scan /path/to/repo --fast
+# Turbo mode: equivalent to --commit-metadata=false --no-base64 and disables MIME sniffing,
+# language detection/tree-sitter parsing for maximum speed
+# No Git commit metadata (author, date, hash), Base64 decoding, MIME, or language metadata in findings
+kingfisher scan /path/to/repo --turbo
# Scan using a rule family
kingfisher scan /path/to/repo --rule kingfisher.aws
diff --git a/crates/kingfisher-core/src/content_type.rs b/crates/kingfisher-core/src/content_type.rs
index 611badb..2100f0c 100644
--- a/crates/kingfisher-core/src/content_type.rs
+++ b/crates/kingfisher-core/src/content_type.rs
@@ -110,7 +110,7 @@ impl ContentInspector {
#[inline]
#[must_use]
pub fn guess_language(&self, path: &Path, content: &[u8]) -> Option {
- // 1) Extension mapping (fast, no I/O).
+ // 1) Extension mapping (turbo, no I/O).
if let Some(ext) = path.extension().and_then(|e| e.to_str()) {
if let Some(lang) = LanguageType::from_file_extension(&ext.to_ascii_lowercase()) {
return Some(lang.name().to_string());
diff --git a/src/cli/commands/scan.rs b/src/cli/commands/scan.rs
index d77a8ac..b378d1f 100644
--- a/src/cli/commands/scan.rs
+++ b/src/cli/commands/scan.rs
@@ -151,9 +151,9 @@ pub struct ScanArgs {
#[arg(global = true, long, default_value_t = false)]
pub no_base64: bool,
- /// Fast mode: equivalent to --commit-metadata=false --no-base64
- #[arg(global = true, long, default_value_t = false)]
- pub fast: bool,
+ /// Turbo mode: equivalent to --commit-metadata=false --no-base64 and disables MIME sniffing, language detection, and tree-sitter parsing
+ #[arg(global = true, long = "turbo", default_value_t = false)]
+ pub turbo: bool,
/// Timeout for Git repository scanning in seconds
#[arg(global = true, long, default_value_t = 1800, value_name = "SECONDS")]
@@ -490,7 +490,7 @@ impl ScanCommandArgs {
self.scan_args.no_dedup = true;
}
- if self.scan_args.fast {
+ if self.scan_args.turbo {
self.scan_args.no_base64 = true;
self.scan_args.input_specifier_args.commit_metadata = false;
}
diff --git a/src/direct_validate.rs b/src/direct_validate.rs
index a962a07..9c00929 100644
--- a/src/direct_validate.rs
+++ b/src/direct_validate.rs
@@ -961,7 +961,7 @@ pub(crate) fn create_minimal_scan_args() -> crate::cli::commands::scan::ScanArgs
skip_aws_account_file: None,
output_args: OutputArgs { output: None, format: ReportOutputFormat::Pretty },
no_base64: false,
- fast: false,
+ turbo: false,
no_inline_ignore: false,
no_ignore_if_contains: false,
validation_timeout: 10,
diff --git a/src/findings_store.rs b/src/findings_store.rs
index d38c421..8785b56 100644
--- a/src/findings_store.rs
+++ b/src/findings_store.rs
@@ -262,7 +262,7 @@ impl FindingsStore {
// Origin::Extended(_) => "ext",
// };
- // // 64-bit key (fast, cheap, good dispersion)
+ // // 64-bit key (turbo, cheap, good dispersion)
// let key = xxh3_64(
// format!(
// "{}|{}|{}",
diff --git a/src/main.rs b/src/main.rs
index 77bebe8..22146c0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -577,7 +577,7 @@ fn create_default_scan_args() -> cli::commands::scan::ScanArgs {
skip_aws_account_file: None,
output_args: OutputArgs { output: None, format: ReportOutputFormat::Pretty },
no_base64: false,
- fast: false,
+ turbo: false,
no_inline_ignore: false,
no_ignore_if_contains: false,
validation_timeout: 10,
diff --git a/src/reporter.rs b/src/reporter.rs
index 779a25b..e5b6366 100644
--- a/src/reporter.rs
+++ b/src/reporter.rs
@@ -1781,7 +1781,7 @@ mod tests {
view_report: false,
redact: false,
no_base64: false,
- fast: false,
+ turbo: false,
git_repo_timeout: 1_800,
output_args: OutputArgs { output: None, format: ReportOutputFormat::Pretty },
baseline_file: None,
diff --git a/src/reporter/json_format.rs b/src/reporter/json_format.rs
index 8fabe4e..62e636a 100644
--- a/src/reporter/json_format.rs
+++ b/src/reporter/json_format.rs
@@ -193,7 +193,7 @@ mod tests {
skip_aws_account: Vec::new(),
skip_aws_account_file: None,
no_base64: false,
- fast: false,
+ turbo: false,
no_inline_ignore: false,
no_ignore_if_contains: false,
validation_timeout: 10,
diff --git a/src/scanner/enumerate.rs b/src/scanner/enumerate.rs
index 01075db..3144d65 100644
--- a/src/scanner/enumerate.rs
+++ b/src/scanner/enumerate.rs
@@ -238,7 +238,14 @@ pub fn enumerate_filesystem_inputs(
return Ok(());
}
progress.inc(blob.len().try_into().unwrap());
- match processor.run(origin, blob, args.no_dedup, args.redact, args.no_base64) {
+ match processor.run(
+ origin,
+ blob,
+ args.no_dedup,
+ args.redact,
+ args.no_base64,
+ args.turbo,
+ ) {
Ok(None) => {
// nothing to record
}
diff --git a/src/scanner/processing.rs b/src/scanner/processing.rs
index 3461eed..fc441b0 100644
--- a/src/scanner/processing.rs
+++ b/src/scanner/processing.rs
@@ -28,13 +28,18 @@ impl<'a> BlobProcessor<'a> {
no_dedup: bool,
redact: bool,
no_base64: bool,
+ fast_mode: bool,
) -> Result