Nuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration to tackle trending vulnerabilities on the internet. It helps you find vulnerabilities in your applications, APIs, networks, DNS, and cloud configurations.
This report summarizes scanner evidence for projectdiscovery/nuclei, a Go project with 32,489 GitHub stars. SynthScan examined 207,516 lines of code across 1340 source files, recording 243 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 237 finding(s).
Are imports declared and package/API names verified? 6 finding(s).
Are wrappers, guards, and repeated structures necessary? 2 finding(s).
Which changes need focused human review? 243 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 243 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .goreleaser.yml | 81 | goarch: arm64 | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 1 | # global allow/deny list. this will affect both exporters | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 21 | # # project-name is the name of the repository | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 41 | # # username is the username of the GitLab user | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 61 | # # (GitLab returns at most 100 issues per page) | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 81 | # # these severity labels or tags (does not affect exporters. set those globally) | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 101 | # update-existing: false | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 121 | # # these severity labels or tags (does not affect exporters. set those globally) | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 141 | # freeform: $CVSSMetrics | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 161 | # # api-key is the API key for the linear account | COMMENT |
| LOW | cmd/nuclei/issue-tracker-config.yaml | 181 | # # (e.g., mongodb://root:example@localhost:27017/nuclei?ssl=false&authSource=admin) | COMMENT |
| LOW | internal/tests/integration/http_test.go | 981 | // Execute executes a test case and returns an error if occurred | COMMENT |
| LOW | …sts/integration/testdata/workflow/code-template-2.yaml | 21 | # digest: 490a0046304402204cbb1bdf8370e49bb930b17460fb35e15f285a3b48b165736ac0e7ba2f9bc0fb022067c134790c4a2cf646b195aa44 | COMMENT |
| LOW | …tests/integration/testdata/protocols/code/py-file.yaml | 21 | # digest: 4a0a00473045022100bb6b75819ea62be7415adf544e208fcff3501277f6f7a152e1c3083c476126f502201db7978917bc31c755a4ce53 | COMMENT |
| LOW | internal/tests/functional/testdata/testcases.txt | 61 | # Input Types | COMMENT |
| LOW | .github/dependabot.yml | 41 | # schedule: | COMMENT |
| LOW | .github/workflows/tests.yaml | 221 | # name: "Performance regression" | COMMENT |
| LOW | lib/sdk_private.go | 381 | if err := installer.UpdateIgnoreFile(); err != nil { | COMMENT |
| LOW | lib/multi.go | 181 | COMMENT | |
| LOW | lib/tests/scale_regression_test.go | 1 | //go:build regression | COMMENT |
| LOW | helm/values.yaml | 21 | list: /config/target-list.txt | COMMENT |
| LOW | helm/values.yaml | 41 | #include-tags: dos,fuzz # Tag based inclusion (allows overwriting nuclei-ignore list) | COMMENT |
| LOW | pkg/reporting/trackers/jira/jira.go | 181 | // Cloud value (optional) is set to true when Jira cloud is used | COMMENT |
| LOW | pkg/reporting/trackers/jira/jira.go | 201 | // ProjectID is the ID of the project (optional) | COMMENT |
| LOW | pkg/types/types.go | 161 | // InteractionsCacheSize is the number of interaction-url->req to keep in cache at a time. | COMMENT |
| LOW | pkg/types/types.go | 201 | // Deprecated: Enabled by default through clistats . Metrics enables display of metrics via an http endpoint | COMMENT |
| LOW | pkg/types/types.go | 221 | // (/user/1, /user/2, ...) are scanned. Zero, the default, scans every | COMMENT |
| LOW | pkg/types/types.go | 261 | // UpdateTemplates updates the templates installed at startup (also used by cloud to update datasources) | COMMENT |
| LOW | pkg/types/types.go | 341 | // StoreResponse stores received response to output directory | COMMENT |
| LOW | pkg/types/types.go | 521 | // DASTProxyAddress is the listen address for the dast proxy | COMMENT |
| LOW | pkg/types/types.go | 541 | DoNotCacheTemplates bool | COMMENT |
| LOW | pkg/progress/progress.go | 21 | Init(hostCount int64, rulesCount int, requestCount int64) | COMMENT |
| LOW | pkg/operators/operators.go | 21 | // Matchers contains the detection mechanism for the request to identify | COMMENT |
| LOW | pkg/operators/matchers/match_llm.go | 41 | COMMENT | |
| LOW | pkg/operators/matchers/matchers.go | 21 | Condition string `yaml:"condition,omitempty" json:"condition,omitempty" jsonschema:"title=condition between matcher var | COMMENT |
| LOW | pkg/operators/matchers/matchers.go | 41 | // examples: | COMMENT |
| LOW | pkg/operators/matchers/matchers.go | 61 | // []string{"mail.protection.outlook.com"} | COMMENT |
| LOW | pkg/operators/matchers/matchers.go | 81 | // []string{"4a4156412050524f46494c45", "4850524f46", "1f8b080000000000"} | COMMENT |
| LOW | pkg/operators/matchers/matchers.go | 101 | // value: > | COMMENT |
| LOW | pkg/operators/matchers/matchers.go | 121 | Expect string `yaml:"expect,omitempty" json:"expect,omitempty" jsonschema:"title=expected llm verdict,description=Verdi | COMMENT |
| LOW | pkg/operators/matchers/matchers.go | 141 | COMMENT | |
| LOW | pkg/operators/matchers/matchers.go | 161 | CaseInsensitive bool `yaml:"case-insensitive,omitempty" json:"case-insensitive,omitempty" jsonschema:"title=use case in | COMMENT |
| LOW | pkg/operators/extractors/extractors.go | 21 | Type ExtractorTypeHolder `json:"type" yaml:"type"` | COMMENT |
| LOW | pkg/operators/extractors/extractors.go | 41 | // - name: Example Regex Group | COMMENT |
| LOW | pkg/operators/extractors/extractors.go | 61 | // - name: Extracting value of Content-Type Cookie | COMMENT |
| LOW | pkg/operators/extractors/extractors.go | 81 | XPath []string `yaml:"xpath,omitempty" json:"xpath,omitempty" jsonschema:"title=html xpath expressions to extract data, | COMMENT |
| LOW | pkg/operators/extractors/extractors.go | 101 | // documented in docs for each request type. | COMMENT |
| LOW | pkg/operators/extractors/extractors.go | 121 | // | COMMENT |
| LOW | pkg/operators/extractors/type_specific_fields.go | 21 | // type collects, which is indistinguishable from "nothing matched the target". | COMMENT |
| LOW | pkg/operators/extractors/type_specific_fields_test.go | 101 | }) | COMMENT |
| LOW | pkg/input/types/roundtrip_test.go | 1 | package types | COMMENT |
| LOW | pkg/input/formats/formats.go | 21 | type InputFormatOptions struct { | COMMENT |
| LOW | pkg/input/normalize/normalize.go | 1 | // Package normalize collapses URLs that address the same resource onto one | COMMENT |
| LOW | pkg/js/libs/kerberos/kerberosx.go | 41 | COMMENT | |
| LOW | pkg/js/libs/kerberos/kerberosx.go | 61 | func (c *Config) SetTimeout(timeout int) *Config { | COMMENT |
| LOW | pkg/js/libs/kerberos/kerberosx.go | 141 | // Link Constructor to Client and return | COMMENT |
| LOW | pkg/js/libs/kerberos/kerberosx.go | 161 | return &Client{Krb5Config: config}, nil | COMMENT |
| LOW | pkg/js/libs/kerberos/kerberosx.go | 301 | resp.Ticket = ticket | COMMENT |
| LOW | pkg/js/libs/kerberos/kerberosx.go | 321 | // c.nj.Throw("KDC address blacklisted by network policy") | COMMENT |
| LOW | pkg/js/libs/kerberos/kerberosx.go | 341 | // // login to get TGT | COMMENT |
| 173 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | pkg/protocols/http/request.go | 1687 | Severity: request.options.TemplateInfo.SeverityHolder.Severity.String(), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pkg/js/libs/smtp/smtp_limit_test.go | 35 | msg := (&SMTPMessage{}).From("scanner@example.com").To("admin@example.org") | CODE |
| LOW | pkg/js/libs/smtp/smtp_limit_test.go | 55 | msg := (&SMTPMessage{}).From("scanner@example.com").To("admin@example.org").Subject("hello").Body([]byte("world")) | CODE |
| LOW | pkg/js/libs/smtp/smtp_test.go | 27 | msg := (&SMTPMessage{}).From("scanner@example.com").To("admin@example.org").Subject("hello").Body([]byte("world")) | CODE |
| LOW | pkg/js/libs/smtp/smtp_test.go | 68 | msg := (&SMTPMessage{}).From("scanner@example.com").To("admin@example.org") | CODE |
| LOW | pkg/fuzz/dataformat/multipart_test.go | 223 | assert.Equal(t, "John Doe", decoded.Get("name")) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pkg/tmplexec/flow/README.md | 99 | ## request execution orchestration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pkg/js/global/js/active_directory.js | 34 | function getDomainControllerNameBySMB(host) { | CODE |
| LOW | pkg/js/global/js/active_directory.js | 47 | function getDomainControllerNameByLDAP(host) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pkg/catalog/index/metadata.go | 77 | // For maintainers: when adding new fields, don't forget to update the | COMMENT |